對(duì)于一個(gè)存在著標(biāo)準(zhǔn)輸入輸出的C++控制臺(tái)程序,一般會(huì)在#include <iostream>的下一行發(fā)現(xiàn)一句話,using
namespace std。這句話其實(shí)就表示了所有的標(biāo)準(zhǔn)庫(kù)函數(shù)都在標(biāo)準(zhǔn)命名空間std中進(jìn)行了定義。其作用就在于避免發(fā)生重命名的問題。
1. 關(guān)于namespace
C++引入了命名空間namespace主要解決了多個(gè)程序員在編寫同一個(gè)項(xiàng)目中可能出現(xiàn)的函數(shù)等重名的現(xiàn)象。解決方法就是加上自己的命名空間。比如下面的例子:
上例中的“ZhangSan::a”和“LiSi::a”分別表示了調(diào)用張三命名空間中的a變量和李四命名空間中的a變量。這樣的好處顯而易見,那就是雖然張三和李四這兩個(gè)程序員都定義了一個(gè)變量a,但是并不會(huì)出現(xiàn)重名的危險(xiǎn)。
運(yùn)行結(jié)果為:
![]() 2. 關(guān)于using namespace *
顧名思義,using namespace * 就表示釋放命名空間*
中間的東西。好處在于我們?cè)诔绦蚶锩婢筒挥迷诿總€(gè)函數(shù)的頭上都加上*::來(lái)調(diào)用。比如說如果上面那個(gè)程序,如果我們不在using namespace
std,那么我們就需要在主函數(shù)中的標(biāo)準(zhǔn)輸出流cout函數(shù)前面加上std,寫成
表示調(diào)用std空間里面的標(biāo)準(zhǔn)輸出流cout。但是有些時(shí)候我們也不能圖這個(gè)方便,比如說如果在主函數(shù)中將命名空間ZhangSan和LiSi的中所定義的變量釋放出來(lái),如下例1:
這個(gè)程序輸出結(jié)果為:
![]() 如果我們?cè)谥骱瘮?shù)中把 int a=1給刪除,如下例2:
會(huì)發(fā)現(xiàn)根本就不會(huì)通過編譯,輸出的錯(cuò)誤信息為:
分析可以看出,上面這個(gè)例2會(huì)引起歧義。因?yàn)閆hangSan中間的a被釋放出來(lái),同理LiSi中間的a也被釋放出來(lái)了。那么編譯器就不知
道到底哪個(gè)才是需要輸出的a,自然就會(huì)引起歧義了。同理,在例1中,編譯器同樣不知道到底哪個(gè)才是需要輸出的a,于是它只采用了主函數(shù)中自己定義的a,這
樣程序也不會(huì)報(bào)錯(cuò),但是只會(huì)輸出1,自然結(jié)果就如上面的圖所示了。
|
|