總結: 名字空間

在做項目的時候,遇到了一個這樣的問題,下邊舉了一個小例子來模擬一下:

 

可能讀沒有遇到過類似的問題,如果你知道,你就不需要往下看了。如果你還不清楚上邊代碼有什麼問題,那麼請繼續;

      C++鼓勵我們使用名字空間,名字空間有助於組織程序中使用的標示符,避免名字衝突。但是對於名字空間的使用,C++新手還是有使用不當的時候。

      可能你會反駁,名字空間有什麼難的,不就是個namespace {}; 還有個using namespace  ..;嗎?那麼如果你這樣理解的話,那麼請你找出上邊代碼的問題。

      現在,我來告訴你上邊代碼的問題所在。在std名字空間中,有一個transform的標示符,而我們的main函數中需要使用的是STL的transform,這兩個函數雖然名字相同,但是卻是不同的定義。

      而我們在test.h中使用了using namespace std;  我們在main.cpp中包含了test.h,相當於我們在main函數中也使用了using namespace std;。而我們使用的transform函數確不屬於這個名字空間。也就是說,在main函數中不能直接使用using namespace std;導出std名字空間中的所有名稱,這樣做不符合名字空間的設計初衷。而在很多C++的教材中,大部分的案例都是採用了using namespace std;.這樣給初學者造成了一個感性的錯誤認識。

      那麼我們應該怎麼做呢?

     1.最好不要在頭文件中使用using namespace std;

     2.在源文件中可以使用,但是不建議導出所有的名稱。用那些就導出哪些;

     3.可以自己定義一個名字空間,把我們常使用的名稱放在裏邊;

       如:

namespace mystd
{
    using std::cout;
    using std::cin;
    using std::string;
    using std::stringstream;
    using std::fstream;
    using std::vector;
    ...
}

 

如果調用的時候 ,直接應用using namespacet mystd;

可以根據需要隨時修改名字空間的內容。這樣就避免了每次都要導出需要的名稱的問題。

 

那麼文章開始的程序的正確代碼如下:

發佈了24 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章