命名空間詳解

2021-06-28 20:43:33 字數 2454 閱讀 7280

1、一種定義作用域機制,即命名空間。用於放置傳統上c和c++全域性宣告的東西。這種作用域可以命名,訪問命名空間的成員採用訪問類成員的傳統記法:namespace_name::mumber_name。事實上,類作用域可以看做名字空間的特殊情況。

2、一種名字空間名定義區域性同義詞的機制。

3、一種允許不顯示寫出namespace_name::量詞而訪問名字空間成員的機制:使用宣告。(例如:using namespace std::cout;)

4、一種允許不顯示寫出namespace_name::量詞而訪問名字空間的全部成員的機制:使用指示。(例如:using namespace std;)

例如:namespace a;}

在命名空間括號裡面宣告的東西就是在命名空間a內部的東西,它們不會和其他命名空間中的東西衝突。命名空間的宣告或者定義和全域性宣告具有完全相同的語義,只是它們的名字被限定在命名空間之中。

使用命名空間:

1、顯示的呼叫:

a::f();

2、通過使用宣告機制,不需要量化描述:

using a::f;

void g()

// meaning : g() ,no a::g()

乙個使用宣告在區域性作用域為它所提出的名字引進乙個同義詞。

3、通過使用指示指示,也不需要量化描述:

using namespace a;

string s1 = "hello world";    //meaning : a::string

另外,c++中沒有為描述成員的表而引用特殊的使用宣告形式。當要用到乙個命名空間中多個名字的時候還是乖乖的寫多幾個using吧。

比如:如果有這種機制的話可能是:

using a::(f,g);

正確的宣告形式為:

using a::g;

using a::f;

注意到,命名空間的作用域的。例如:

#include void f()

int main()

這說明命名空間的也是有作用域的。在這裡,using的作用域僅在函式f中。

1、方便性和安全性:

使用宣告時向區域性作用域裡面新增一些東西。而使用指示並不新增任何東西,它只是是一些名字能夠被訪問。

例如:

#include namespace x

int j;

void f()

void g()

int main()

這裡有乙個很重要的原則:區域性宣告的名字(無論是通過正常的區域性宣告所宣告的,還是通過使用宣告)遮蔽名字相同的非區域性宣告,而名字的任何非法過載都將在宣告點被檢查出來。

namespace a

namespace b

viod()

2、全域性作用域:

引進命名空間之後,全域性作用就變成了另外的命名空間。全域性空間和其他的命名空間相比,不同之處在於,你不必在顯式量化形式中寫出它的名字,例如:::f()意思是「全域性作用域裡面的那個f」,而x::f則是「命名空間x中的那個f」

更進一步地,看下面的例子:

int a;

namespace x

} 也就是說,用::a量化的a意味著是全域性的a,而不是「外面最靠近的那層命名空間(這裡是x)」的a。繼續強調的一點是,使用指示不會再它出現的作用域裡面宣告任何名字。

3、過載

c++中允許跨命名空間的過載:

#include namespace a

}namespace b

}using namespace a;

using namespace b;

int main()

不過這是個很難查詢的問題,慎用吧。但是也可以用來維護一些舊的**。比如:

void f(int)     //from a.h

void f(char)  //from b.h

void g()

在這裡,這要把兩個標頭檔案換成命名空間就行了,其他的什麼都不用改。

4、巢狀的命名空間:

這個很好理解,就是乙個名空間裡面還可以定義乙個命名空間。這時常規的作用域和量化規則照樣適用。

例如:

#include namespace a

namespace b

void f()

}}void h()

int main()

在這裡,b被限制在了a中。

6、命名空間是開放的。

命名空間是開放的,也就是說,你可以在多個名字空間宣告中,將名字加進乙個名字空間中。

例如:

#include namespace a

}namespace a

void f() }

int main()

xml命名空間詳解

在研究spring security的時候,裡面提到了乙個重要的感念就是命名空間,當時以為是spring的乙個什麼特殊功能,後來研究後才發現是xml的乙個知識點,順便又研究了一下這個知識,找到一篇文章感覺挺好,在此做個記錄。關於命名空間有很多人迴避。認為太難。其實命名空間使用很普遍,在xml中也大量...

Visual C 命名空間詳解

命名空間提供了一種組織相關類和其他型別的方式。與檔案或元件不同,命名空間是一種邏輯組合,而不是物理組合。在c 檔案中定義類時,可以把它包括在命名空間定義中。以後,在定義另乙個類,在另乙個檔案中執行相關操作時,就可以在同乙個命名空間中包含它,建立乙個邏輯組合,告訴使用類的其他開發人員這兩個類是如何相關...

php 命名空間詳解

test1.php 的內容如下 class test test2.php 的內容如下 class test index.php 的內容如下 php提示我們不能宣告 test2.php 的 test類 這是為什麼呢 其實是因為 test2.php 中的 test類 和 test1.php 中的類重名了...