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