2015-02-12 65 views
-3

不可否認,我是C++的新手,我正在努力學習不同的新東西。命名空間的好奇案例std

請解釋using namespace std

我的意思的情況下,有些人使用的東西,像std::cinstd::string所有的時間,而不是打字using namespace std和簡單地使用從該點cinstring向前。有什麼好的理由,爲什麼他們通過擠奶你知道什麼出std ::做這樣一個看似愚蠢的事情?

回答

2

using namespace std;可以被使用和濫用,就像大多數其他事情一樣。

你應該記住的一條規則是

  • 不要把一個using namespace std;在全局命名空間中的標題。

這是因爲像distance這樣的名字很容易與客戶端代碼發生衝突。

一般來說,C++命名空間的優點是它們允許在名稱衝突處容易消歧,而通常允許您使用可讀的非限定名稱。如果一個人總是限定名字,那麼與C風格的固定前綴和後綴的唯一區別就是在那裏存在::,我不認爲可以認爲讓名字中的冒號具有任何優勢。但是這個論點只涉及到一個自己定義的命名空間:對於std命名空間,可以認爲它是由標準強加的,所以完全限定名稱的實踐意味着始終使用std::(並且我知道這是通過公司數量,儘管我強烈反對這些程序員聲稱代碼是更多可讀比沒有std::前綴)。

+0

我是一個菜鳥。請解釋這是什麼意思:「永遠不要把使用命名空間std;在一個頭中的全局命名空間。」什麼是全局命名空間?它是預處理器指令和main之間的空間嗎? – 2015-02-12 05:51:19

+0

@TheVigilanteSting檢查我詳細的解釋,希望我幫助 – 2015-02-12 05:52:10

+0

@TheVigilanteSting全局命名空間是一個類或命名空間外面,所以如果你把一個頭文件中使用napespace性病,這將適用於所有的源文件,其中包括該頭文件。 – Dronz 2015-02-12 05:53:44

0

這根本不是一個愚蠢的問題。

iostream是一個C++代碼文件(更具體地說是一個頭文件,但沒關係)。它包含定義cout,cin,endl等的代碼。如果我們想使用它們,我們需要它們在我們的代碼中,這就是我們爲什麼要包含它的原因。但是,如果我們看一下它的內容,我們將(示意性地)看到類似的東西(這不是試圖以示意圖映射iostream的嚴肅嘗試,但我會避免使事情太複雜,並且爲了解釋,它會做):

// iostream header file  
    namespace std 
    { 
     ostream cout; 
     istream cin; 
     // etc etc 
    }; 

使用using關鍵字並不意味着我們增加了功能,這意味着我們說我們默認閱讀。如果我們說使用namespace std;那麼我們說:如果我們遇到一個在我們當前命名空間中不存在的OBJECT名稱,檢查是否存在它存在的名稱空間std,並使用該對象。因此,它並沒有真正添加一個函數,它是包含「加載」cout,cin,endl和所有類似的函數。

(請注意,上述的原理是不打開的iostream文件時,實際上它是一個複雜得多,你會發現什麼,還含有大量的定義。)

的教程頁面給出一個很好的解釋http://www.cplusplus.com/doc/tutorial/namespaces/

0

命名空間是一種結構化程序的方式,想象你有你自己的字符串類放入命名空間富。如果你沒有明確輸入std:string,編譯器會混淆應該使用哪個字符串。