名字空間允許我們封裝名字,否則的話,這些名字就有可能污染到全局的名字空間(pollute teh global namespce).一般來說,只有我們希望我們的代碼被外部軟件開發部門使用的時候。才會用到名字空間。
例如;我們可以這樣來封裝Array類,
namespace cplacple_primer_3E
{
template <calss eyemly>
calss Array{,,,,,,,,,};
////////////////////////
}
namespce后面的名字標明了一個名字空間。它獨立于全局名字空間。我們可以在里面放一些希望聲明在函數和類之外的實體。名字空間并不改變他們的聲明意義。只是改變了它們的可視性。如果名字空間中的聲明對于程序來說不是立即可見的。那么我們雜樣來訪問他們呢?我們就要用到限定修飾名字符.
格式如下:
namespce_idenerfier::entrityname
名字空間別名(namespce alias)允許用一個可替代的,短的,或者跟一般的名字來和名字空間來關聯起來。
例如:
//提供一個更一般化的名字
namespce lib=cplacple_primer_3E
然后這個名字就會稱為原始名字空間的同義詞。
#include "cplacple.h"
int main()
{
lib::Array{...........}
}
別名也可以 用來封裝正在使用的實際的名字空間。在這種情況下,我們可以通過改變別名的名字空間。
來改變所使用的聲明集。而無需改變“通過別名來訪問這些聲明”。的實際代碼。
using 指示符使名字空間中的所有的聲明都是可見得。這樣這些聲明可以不加任何的限定的使用。
using和namespce都是關鍵字。被引用的名字空間必須已經被聲明了。否則的話,會引起編譯的錯誤。
using 聲明提供了更為精細的名字可視化機制。它允許使名字空間中的單個的聲明可見。
例如:
#include"IBM_Canada_Labaraory.h"
using namespace IBM_Canada_Labaraory::Matriy
int main()
{
//ok; IBM_Canada_Labaraory::Matriy
Matriy met(4,5);
//fail,錯誤。IBM_Canada_Labaraory::Array不可見
Array array(4,5);
}
為了防止標準的c++庫組件污染用戶定義的名字空間。所有的c++庫組件都聲明在一個稱為std的名字空間中。
所以即使我們在我們的文本文件中已經包含了c++庫頭文件,頭文件中聲明的內容在我們的文本文件中也是不可見的。
例如:
在c++中下面的代碼是不能被編譯通過的。
#include<string>
///錯誤。string 是不可見的
string current_string="asdf dfdff";
在string 頭文件中所有的聲明都包含在std名字空間中。
我們可以用“#include 指示符后面加上using 的辦法使在<string>中的,在std中聲明的組件,對于我們的文本文件是可見得。
例如:
#include<string>
using namespace std
int main()
{
//////////正確。string 是可見的。
string current_string="asd fdfdf"
}
為了使在std中,聲明的組件和名字在我們的文本文件中可見。using指示符通常被看作是一種比較差的選擇方案。
在上面的例子中。指示符using ,使在string頭文件中聲明的,并且在std名字空間中的 組件在我們的文本文件中都是可見的。這又將全局名字空間污染問題帶回來了。而這個問題就是std名字空間首先要努力避免的。
它增加了“c++標準庫組件的名字”與“我們程序中聲明的全局名字”沖突的機會。
現在有兩種機制可以替代using指示符。來引用隱藏在std名字空間中的名字string.
第一種方法:
可以使用限定的名字。
#include<string>
/////正確。使用限定的名字
std:: string current_string="afdfdfsdfs";
第二種方法:
如下使用using 聲明;
#include<string>
using std::string;
/////ok.上面的using聲明使string可見。
string=“dfdfdfafsdf”;
為了使用名字空間中的聲明的名字。最好使用帶有精細選擇功能的 using聲明替代using 指示符。