使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突。
在C++中,變量、函數和類都是大量存在的。如果沒有命名空間,這些變量、函數、類的名稱將都存在于全局命名空間中,會導致很多沖突。比如,如果我們在自己的程序中定義了一個函數toupper(),這將重寫標準庫中的toupper()函 數,這是因為這兩個函數都是位于全局命名空間中的。命名沖突還會發生在一個程序中使用兩個或者更多的第三方庫的情況中。此時,很有可能,其中一個庫中的名 稱和另外一個庫中的名稱是相同的,這樣就沖突了。這種情況會經常發生在類的名稱上。比如,我們在自己的程序中定義了一個Stack類,而我們程序中使用的某個庫中也可能定義了一個同名的類,此時名稱就沖突了。
Namespace 關鍵字的出現就是針對這種問題的。由于這種機制對于聲明于其中的名稱都進行了本地化,就使得相同的名稱可以在不同的上下文中使用,而不會引起名稱的沖突。或許命名空間最大的受益者就是C++中的標準庫了。在命名空間出現之前,整個C++庫都是定義在全局命名空間中的(這當然也是唯一的命名空間)。引入命名空間后,C++庫就被定義到自己的名稱空間中了,稱之為std。這樣就減少了名稱沖突的可能性。我們也可以在自己的程序中創建自己的命名空間,這樣可以對我們認為可能導致沖突的名稱進行本地化。這點在我們創建類或者是函數庫的時候是特別重要的。
C++標準程序庫中的所有標識符都被定義于一個名為std的namespace中。
namespace是指標識符的各種可見范圍。命名空間用關鍵字namespace 來定義。命名空間是C++的一種機制,用來把單個標識符下的大量有邏輯聯系的程序實體組合到一起。此標識符作為此組群的名字。
C++標準程序庫中的所有標識符都被定義于一個名為std的namespace中。 由于namespace的概念,使用C++標準程序庫的任何標識符時,
可以有三種選擇:
[1] 直接指定標識符
例如std::iostream而不是iostream。完整語句如下:
~~~
std::cout<<std::hex<<3.4<<std::endl;
~~~
[2]使用using關鍵字
~~~
using std::cout;
using std::endl;
using std::cin;
cout << hex << 3.4 << endl;
~~~
[3]使用using namespace std
~~~
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
~~~
但是坑兒就再這里,從我們學習C++開始,很愿意寫using namespace std,這樣在實際工程中也許就會有所災難。
看看下面的代碼:
~~~
using namespace foo;
using namespace bar;
~~~
一切都有序進行,你可以從Foo中調用Blah,可以從Quux調用Bar。
但是有一天,你升級了Foo,在Foo中也聲明了一個Quux函數,這樣問題就來了。
也許是別人給你挖的坑兒,也許是你挖了坑在等別人。
所以千萬不要使用using namespace std這樣的語句在實際工程中,不能嫌麻煩,在調用的函數的時候,在前面冠以命名空間。
也許有的人對此感到不屑,但是對于一個優秀的程序員好習慣一定是必要的!!!
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- string中的c_str()陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常