天天看點

std空間和全局命名空間目錄參考資料

目錄

注意不要盲目相信以下内容! 不要盲目相信以下内容! 不要盲目相信以下内容! (重要的事情說三遍),雖然以下内容也經過了我的驗證,但是我的驗證可能有錯誤的地方,歡迎大家留言告知。希望這篇文章成為你深入探索相關領域的引子和啟發,而不是标準答案。

在C++中,我們常用的頭檔案為不帶“.h”字尾的頭檔案,而這些頭檔案裡所包含和定義的辨別符在std空間中,是以我們使用C++時經常需要加上

using namespace std;           

而原C語言的頭檔案為帶“.h”字尾的頭檔案,這些頭檔案裡所包含和定義的辨別符在全局命名空間中,不需要聲明使用std空間。

命名空間是一種特殊的作用域,它包含了處于該作用域中的所有标示符,而且其本身也是由标示符表示的。

拿一個簡單的例子來類比,當我們在C++中聲明了一個類A之後,我們在類外定義類A的成員函數,這時我們需要在傳回值後函數名之前加上

A::           

來說明該函數為類A的成員函數。

命名空間也一樣是用來說明辨別符的所屬範圍,命名空間的使用目的是為了将邏輯相關的标示符限定在一起,組成相應的命名空間,可使整個系統更加子產品化,最重要的是它可以防止命名沖突。

就好比在兩個函數或類中定義相同名字的對象一樣,利用作用域标示符限定該對象是哪個類裡定義的。

C++中的命名空間

C++語言是從C語言發展起來的,是以有很多借鑒的地方。當C++語言推出但尚未标準化以前(98年才标準化),市場上已經有了很多版本的程式庫了,各庫林立,導緻互相應用時出現了一個很難調和的難題,那就是命名沖突,又稱名空間泛濫。

比如某個庫寫了個函數line(int x,int y);不巧另外一個庫又寫了個類class line;這下編譯器該比對哪個呢?隻好取決于哪個庫檔案先被引用到檔案中,并且把另外一個完全屏蔽掉。這顯然不是一個好的方法。

在标準庫的産生過程中,這個問題被提了出來。為此,标準庫組織決定在标準庫中引入名空間的概念,所有标準庫的元件都在名空間std中定義,由使用者手動引入到程式中,這樣就讓編譯器知道,當遇到一個可能沖突的名稱時,以标準庫中定義的名稱為主,如果想用标準庫外定義的名稱,那程式員需要自己注明另外的名空間,進而達到消除名空間泛濫的目的。

using namespace std;           

的寫法引入了名空間的所有内容,這是一種簡單但不保險的做法,是标準庫組織不推薦這麼做的。因為這樣引入了所有的元件函數名,相當于重新引發了名字空間泛濫的問題。為此,好的做法應該是第二種分别引入。

C++std命名空間詳解 c++标準庫 及 命名空間std

繼續閱讀