1.命名空間能夠定義在幾個不一樣的部分:若是以前沒有名爲nsp的命名空間定義,則上述代碼建立一個新的命名空間;不然,上述代碼打開已經存在的命名空間添加一些新的成員。定義後無需分號spa
2.嵌套的命名空間是指定義在其餘命名空間中的命名空間。嵌套的命名空間是一個嵌套的做用域,內層命名空間聲明的名字將隱藏外層命名空間聲明的同名成員。code
3.未命名的命名空間(unnamed namespace)是指關鍵字namespace後緊跟花括號括起來的一系列聲明語句。未命名的命名空間中定義的變量擁有靜態生命週期:它們在第一次使用前建立,而且直到程序結束才銷燬。在標準C++引入命名空間的概念以前,程序須要將名字聲明成static以使其對於整個文件有效,可是,如今在文件中進行靜態聲明的作法已經被C++標準取消了,取而代之的是使用未命名的命名空間。接口
一個未命名的命名空間能夠在某個給定的文件內不連續,可是不能跨越多個文件。也就是說,未命名的命名空間僅在特定的文件內部有效,其做用範圍不會橫跨多個不一樣的文件。它與全局變量的區別在於 即便全局變量在某文件中定義,而且沒有在描述庫的接口的頭文件中引入。可是它仍然是在全局域中聲明的,所以它是一個全局實體,它的名字不能與任何其餘全局實體的名字衝突 。生命週期
另外,因爲未命名的命名空間它沒有名字,因此其中定義的名字的做用域與該命名空間所在的做用域相同。作用域
4.using聲明和using指示在做用域上有區別:using聲明是將一個成員引入當前命名空間做用域內;using指示是將全部成員引入當前和上一層命名空間做用域內:class
namespace nsp { // 命名空間 int i=16, j=15; } int j = 0; // 全局變量 int main() { using namespace nsp; // 若是使用j,將在::j和nsp::j之間產生衝突 std::cout << j; return 0; }
5.有些命名空間的名字很長或者命名空間嵌套了不少層,咱們能夠爲其設定一個較短的同義詞,也就是別名
變量