命名空間namespace的用法

2021-06-28 23:33:17 字數 3865 閱讀 4781

命名

空間是用來組織和重用**的編譯單元。如同名字一樣的意思,namespace(名字空間),之所以出來這樣乙個東西,是因為人類可用的單詞數太少,並且不同的人寫的程式不可能所有的變數都沒有重名現象,對於庫來說,這個問題尤其嚴重,如果兩個人寫的庫檔案中出現同名的變數或函式(不可避免),使用起來就有問題了,為了解決這個問題,引入了名字

空間這個概念,通過使用 namespace ***;你所使用的庫函式或變數就是在該名字空間中定義的,這樣一來就不會引起不必要的衝突了。

所謂namespace,是指識別符號的各種可見範圍。c++標準程式庫中的所有識別符號都被定義於乙個名為std的namespace中。

using

關鍵字

如果在程式中需要多次引用某個命名空間的成員,那麼按照之前的說法,我們每次都要使用範圍解析符來指定該命名空間,這是一件很麻煩的事情。為了解決這個問題,人們引入了

using

關鍵字。

using

語句通常有兩種使用方式:

using namespace 命名空間名稱;

using 命名空間名稱::成員;

第一種形式中的命名空間名稱就是我們要訪問的命名空間。該命名空間中的所有成員都會被引入到當前範圍中。也就是說,他們都變成當前命名空間的一部分了,使用的時候不再需要使用範圍限定符了。第二種形式只是讓指定的命名空間中的指定成員在當前範圍中變為可見。我們用前面的

counternamespace

來舉例,下面的

using

語句和賦值語句都是有效的:

using counternamespace::lowerbound; //只有lowerbound當前是可見的

lowerbound = 10; //這樣寫是合法的,因為lowerbound成員當前是可見的

using counternamespace; //所有counternamespace空間的成員當前都是可見的

upperbound = 100; //這樣寫是合法的,因為所有的counternamespace成員目前都是可見的

當我們用using引入乙個命名空間的時候,如果之前有引用過別的命名空間(或者同乙個命名空間),則不會覆蓋掉對之前的引入,而是對之前引入內容的補充。也就是說,到最後,上述程式中的std和counternamespace這兩個命名空間都變成全域性空間了。

std命名空間

標準c++把自己的整個庫定義在

std命名空間中。這就是本書的大部分程式都有下面**的原因:

using namespace std;

這樣寫是為了把

std命名空間的成員都引入到當前的命名空間中,以便我們可以直接使用其中的函式和類,而不用每次都寫上

std::。

當然,我們是可以顯示地在每次使用其中成員的時候都指定

std::

cout:

std::cout << 「

顯示使用

std::

來指定cout」;

如果我們的程式中只是少量地使用了

std命名空間中的成員,或者是引入

std命名空間可能導致命名空間的衝突的話,我們就沒有必要使用

using namespace std;

了。然而,如果在程式中我們要多次使用

std命名空間的成員,則採用

using namespace std;

的方式把

std命名空間的成員都引入到當前命名空間中會顯得方便很多,而不用每次都單獨在使用的時候顯示指定

下 面通過例程說明關鍵字namespace的用法。 

#include  #include  namespace  car  //  名空間的定義  

namespace plane

} namespace car // 新增名空間的成員

namespace c=car; // 定義名空間的別名

int time; // 外部變數屬於全域性名空間

void main() ;

static const widgetoperator+(const widget& lhs,constwidget& rhs);

...};// 為上面所述的widge和operator+ 建立全域性(無修飾符的)名稱

typedef widgets::widget widget;

const widget (* const operator+)(constwidget&, // 錯誤!

constwidget&); // operator+不能是指標名

widget w1, w2, sum;

sum = w1 +w2; // 錯誤! 本空間沒有宣告

// 引數為widgets 的operator+

sum = widgets::operator+(w1,w2); // 合法, 但不是"自然"的語法

對於型別名,可以用型別定義(typedef)來顯式地去掉空間引用。例如,假設結構s(模擬的名字空間)內有個型別名t,可以這樣用typedef來使得t成為s::t的同義詞:

typedef sdm::handle handle;

正因為這些限制,所以一旦編譯器支援,就要盡早使用真正的名字空間。

在原有定義好的名空間的基礎上,隨時可以往裡增加成員。 

一 :格式不一樣,前者沒有字尾,實際上,在你的編譯器include資料夾裡面可以看到,二者是兩個檔案,開啟檔案就會發現,裡面的**是不一樣的。字尾為.h的標頭檔案c++標準已經明確提出不支援了,早些的實現將標準庫功能定義在全域性空間裡,宣告在帶.h字尾的標頭檔案裡,c++標準為了和c區別開,也為了正確使用命名空間,規定標頭檔案不使用字尾.h。 因此,當使用時,相當於在c中呼叫庫函式,使用的是全域性命名空間,也就是早期的c++實現;當使用的時候,該標頭檔案沒有定義全域性命名空間,必須使用namespace std;這樣才能正確使用cout

二: 由於namespace的概念,使用c++標準程式庫的任何識別符號時,可以有三種選擇:

1、直接指定識別符號。例如std::ostream而不是ostream。完整語句如下: 

std::cout << std::hex << 3.4 << std::endl;

2、使用using關鍵字。

using std::cout; using std::endl; using std::cin;

以上程式可以寫成

cout << std::hex << 3.4 << endl;
3、最方便的就是使用
using namespace std;

例如: using namespace std;這樣命名空間std內定義的所有識別符號都有效(**)。就好像它們被宣告為全域性變數一樣。那麼以上語句可以如下寫: cout 《就把標準庫中的一切都被放在名字空間std中

。但這又會帶來了乙個新問題。無數

原有的c++**都依賴於使用了多年的偽標準庫中的功能

,他們都是在

全域性空間

下的。所以就有了和等等這樣的標頭檔案,乙個是為了相容以前的c++**,乙個是為了支援新的標準。

命名空間std封裝的是標準程式庫的名稱

,標準程式庫為了和以前的標頭檔案區別,一般不加".h"

Namespace 命名空間

namespace 命名空間。命名空間是用來解決不同的類和函式擁有相同的名稱的問題。解決了命名衝突的問題。namespace gxg namespace gaoxiaoguang 使用方法 gxg a gxga gaoxiaoguang a gaoxiaoguanga gxg bfunction g...

命名空間namespace

對using namespace std 的解釋 所謂namespace,是指識別符號的各種可見範圍。c 標準程式庫中的所有識別符號都被定義於乙個名為std的namespace中。由於namespace的概念,使用c 標準程式庫的任何識別符號時,可以有三種選擇 1 直接指定識別符號。例如std os...

namespace 命名空間

在討論如何使用命名空間之前,必須了解 php 是如何知道要使用哪乙個命名空間中的元素的。可以將 php 命名空間與檔案系統作乙個簡單的模擬。在檔案系統中訪問乙個檔案有三種方式 相對檔名形式如foo.txt。它會被解析為 currentdirectory foo.txt,其中 currentdirec...