命名空間
在一個給定作用域中定義的標識符必須是唯一的,對於多人協作開發的龐大而復雜的程序中難免發生名稱沖突,在C語言中並不能提供語法層面上的解決方案,只能依靠人為的命名規范,例如使用特殊的命名前綴來解決這一困境,但這樣會導致變量名稱過長,不利於程序員編寫和閱讀程序,但C++提供了語法層面的解決方案,那就是使用命名空間來解決命名空間污染的問題。
-
命名空間的定義:
以關鍵字namespace開始,后接命名空間的名字,在名字后面接着是一對花括號,花括號擴住一塊聲明和定義,花括號中放入出現在全局作用域的任意聲明:如類,全局變量(以及他們的初始化),函數(以及他們的定義),模版以及其它命名空間。注意:命名空間不能以分號結尾。例:
例如:namespace mynamespace { int nNum = .....; class CStu {....}; }
-
命名空間的定義可以不連續:
作用域必須要連續,而命名空間可以分開在幾個部分中定義,一個命名空間可以分散在多個源文件中,它門合起來構成一個完整的命名空間。 -
在命名空間的外部引用命名空間
方法1:使用 “命名空間名稱::成員名” 引用命名空間成員,例如:
mynamespace::nNum = 3;
方法2:使用using聲明后,直接訪問,例如:
using namespace mynamespace;
nNum =3;
這種方式雖然方便,但是當以這種方式引用的其它名稱空間中有同名變量時就會發生歧義。 -
全局命名空間:
定義在全局作用域中的名字是定義在全局命名空間中的,全局命名空間是隱式的,它沒有名字,可以顯式指定使用全局命名空間中的成員:“::標識符”,例如:一個C++類中有一個名稱
為A的函數,全局定義中也有一個名稱為A的函數,此時要想在類的其他成員函數中使用全局的函數,則需要在A前加上域運算符即可表示使用的是全局中的函數A -
未命名的名稱空間:
未命名的名稱空間在定義時沒有給出名稱,未命名的名稱空間以關鍵字namespace開頭,后面沒有名字,直接跟着一對花括號擴住的聲明塊,未命名的名稱空間不可以跨文件定義和使用,可以在當前文件中不連續定義,引用未命名的名稱空間的成員可以直接使用。C++語法提供這一特征主要是想取代在C語言時代中的靜態聲明,凡是使用static關鍵字的聲明的文件作用域變量和函數都可以使用未命名的名稱空間。 -
命名空間別名:
也可以為命名空間起別名,例如:namespace mystd = std; int main() { mystd::string str = "xxx"; return 0; }
但是不能用typedef為命名空間取別名
C++中的作用域類型
- 局部作用域
- 全局作用域
- 類域
- 命名空間