不可否認,我是C++的新手,我正在努力學習不同的新東西。命名空間的好奇案例std
請解釋using namespace std
我的意思的情況下,有些人使用的東西,像std::cin
或std::string
所有的時間,而不是打字using namespace std
和簡單地使用從該點cin
或string
向前。有什麼好的理由,爲什麼他們通過擠奶你知道什麼出std ::做這樣一個看似愚蠢的事情?
不可否認,我是C++的新手,我正在努力學習不同的新東西。命名空間的好奇案例std
請解釋using namespace std
我的意思的情況下,有些人使用的東西,像std::cin
或std::string
所有的時間,而不是打字using namespace std
和簡單地使用從該點cin
或string
向前。有什麼好的理由,爲什麼他們通過擠奶你知道什麼出std ::做這樣一個看似愚蠢的事情?
using namespace std;
可以被使用和濫用,就像大多數其他事情一樣。
你應該記住的一條規則是
using namespace std;
在全局命名空間中的標題。這是因爲像distance
這樣的名字很容易與客戶端代碼發生衝突。
一般來說,C++命名空間的優點是它們允許在名稱衝突處容易消歧,而通常允許您使用可讀的非限定名稱。如果一個人總是限定名字,那麼與C風格的固定前綴和後綴的唯一區別就是在那裏存在::
,我不認爲可以認爲讓名字中的冒號具有任何優勢。但是這個論點只涉及到一個自己定義的命名空間:對於std
命名空間,可以認爲它是由標準強加的,所以完全限定名稱的實踐意味着始終使用std::
(並且我知道這是通過公司數量,儘管我強烈反對這些程序員聲稱代碼是更多可讀比沒有std::
前綴)。
這根本不是一個愚蠢的問題。
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/
命名空間是一種結構化程序的方式,想象你有你自己的字符串類放入命名空間富。如果你沒有明確輸入std:string,編譯器會混淆應該使用哪個字符串。
我是一個菜鳥。請解釋這是什麼意思:「永遠不要把使用命名空間std;在一個頭中的全局命名空間。」什麼是全局命名空間?它是預處理器指令和main之間的空間嗎? – 2015-02-12 05:51:19
@TheVigilanteSting檢查我詳細的解釋,希望我幫助 – 2015-02-12 05:52:10
@TheVigilanteSting全局命名空間是一個類或命名空間外面,所以如果你把一個頭文件中使用napespace性病,這將適用於所有的源文件,其中包括該頭文件。 – Dronz 2015-02-12 05:53:44