文章目錄
- 1.C++的第?個程序
- 2.命名空間
- 2.1 namespace的價值
- 2.2 namespace的定義
- 2.3 命名空間使?
最新的c++標準(建議收藏)
1.C++的第?個程序
C++兼容C語?絕?多數的語法,所以C語?實現的helloworld依舊可以運?,C++中需要把定義?件代碼后綴改為.cpp,vs編譯器看到是.cpp就會調?C++編譯器編譯
#include<stdio.h>
int main()
{ printf("hello world\n"); return 0;
}
當然C++有?套??的輸?輸出,嚴格說C++版本的helloworld應該是這樣寫的:
#include<stdio.h>
using namespace std;
int main()
{ cout << "hello world\n" << endl; return 0;
}
2.命名空間
2.1 namespace的價值
在C/C++中,變量、函數和類的名稱將都存在于全局作?域中,可能會導致很多沖突。
同一作用域不可重復定義同個變量
使?命名空間的?的是對標識符的名稱進?本地化,以避免命名沖突或名字污染,namespace關鍵字的出現可以解決這個問題
//rand在全局作用域出現兩次
#include<stdio.h>
#include<stdlib.h>//包含rand函數
int rand = 10;//新的全局變量
int main()
{ // 編譯報錯:error C2365: “rand”: 重定義;以前的定義是“函數” printf("%d\n", rand);//不知打印哪個 return 0;
}
2.2 namespace的定義
? 定義命名空間,需要使?到namespace關鍵字,后?跟命名空間的名字,然后接?對{}即可,{}中即為命名空間的成員。命名空間中可以定義變量/函數/類型等。
? namespace本質是定義出?個域,這個域跟全局域各?獨?,不同的域可以定義同名變量,所以下?的rand不在沖突了
? C++中域有函數局部域,全局域,命名空間域,類域;域影響的是編譯時語法查找?個變量/函數/ 類型出處(聲明或定義)的邏輯,所以如果有了域隔離,名字沖突就解決了(局部域和全局域除了會影響編譯查找邏輯,還會影響變量的?命周期,命名空間域和類域不影響變量?命周期)
? namespace只能定義在全局,而且還可以嵌套定義
? 項??程中多?件中定義的同名namespace會認為是?個namespace,不會沖突
? C++標準庫都放在?個叫std(standard)的命名空間中
#include<stdio.h>
#include<stdlib.h>
// 1. 正常的命名空間定義
namespace name
{ // 命名空間中可以定義變量/函數/類型 int rand = 10; int Add(int left, int right) { return left + right; } struct Node { struct Node* next; int val; };
}
int main()
{ // 這?默認是訪問的是全局的rand函數指針//編譯器語法查找確認,默認先局部查找->全局查找//::域作用限定符printf("%p\n", rand); // 這?指定name命名空間中的rand//編譯器語法查找確認,指定作用域,就直接去這個域查找->沒有找到就報錯未聲明的標識符printf("%d\n", bit::name); return 0;
}
//2. 命名空間可以嵌套
namespace name
{ namespace wl{ int rand = 1; int Add(int left, int right) { return left + right; } } namespace wll{ int rand = 2; int Add(int left, int right) { return (left + right)*10; } }
}
int main()
{ printf("%d\n", name::wl::rand); printf("%d\n", name::wll::rand); printf("%d\n", name::wl::Add(1, 2)); printf("%d\n", name::wll::Add(1, 2)); return 0;
}
2.3 命名空間使?
編譯查找?個變量的聲明/定義時,默認只會在局部或者全局查找,不會到命名空間??去查找。所以下?程序會編譯報錯。所以我們要使?命名空間中定義的變量/函數,有三種?式:
? 指定命名空間訪問,項?中推薦這種?式。
? using將命名空間中某個成員展開,項?中經常訪問的不存在沖突的成員推薦這種?式。
? 展開命名空間中全部成員,項?不推薦,沖突?險很?,?常?練習程序為了?便推薦使?。
#include<stdio.h>
namespace bit
{ int a = 0; int b = 1;
}
int main()
{ // 編譯報錯:error C2065: “a”: 未聲明的標識符 printf("%d\n", a); return 0;
}
// 指定命名空間訪問
int main()
{ printf("%d\n", N::a); return 0;
}
// using將命名空間中某個成員展開
using N::b;
int main()
{ printf("%d\n", N::a); printf("%d\n", b); return 0;
}
// 展開命名空間中全部成員
using namespace N;
int main()
{ printf("%d\n", a); printf("%d\n", b); return 0;
}
注意:允許存在未命名的空間
#include<stdio.h>
namespace
{int a = 0; int b = 1;
}
int main()
{printf("%d",a);
}