2015-09-20 49 views
2

我知道string類型存在於namespace std中。我也知道有<string>庫需要包括在內,才能使用string類型。我的問題是:爲什麼我需要兩個(包括庫和使用std命名空間)來定義一個字符串?爲什麼不能通過包含庫來使用它?更一般地說,namespace std包含庫中缺少的是什麼?爲什麼我需要std和string庫在C++中使用字符串

+0

你不需要使用'using namespace std;'。您可以使用該類型直接限定名稱空間。只要寫'std :: string s;'即可。 –

+0

@Martin:'string'不是模板類,'basic_string'是。 –

回答

2

命名空間和頭部是兩個不同的概念做完全不同的事情:

  1. <string>聲明相關的字符串庫類似類模板std::basic_string的各種實體,一些typedef就像std::stringstd::wstring,有的功能。
  2. 命名空間用於分組相關功能並允許在不同名稱空間中使用相同的名稱。例如,「向量」本質上是一些數組(這是由標準C++庫在名稱空間std中定義該名稱的視圖),而在其他上下文中則是數學實體。

當您包含<string>時,您獲得了與在名稱空間std內聲明的字符串庫相關的所有實體。有些人反對使用std::string的想法,因爲它更容易使用string代替。爲了幫助實踐使用指令,即,當查找名稱時,可以使用諸如using namespace std;之類的語句來查看名稱空間std中的實體。也就是說,使用指令只是使名稱不受限制。

2

這樣看待:std::string完整名稱的類型,很像「M. Kostas」是您的完整名稱。

#include <string>給出std::string。只有在您首先確定了正確的上下文後,才能將其稱爲string。通過using namespace stdusing std::string,或者如果您自己碰巧是namespace std { /* ... */ }內的庫代碼。

再次,考慮與姓氏的類比。我只能通過「M.」來提及你。如果我首先確定我正在談論「Kostas」家族(= using namespace std),或者如果我先前用「M.」來表示。我實際上是指「M. Kostas」(= using std::string),或者如果我自己是「Kostas」家族的成員(= namespace std { /* ... */ })。

請注意,您應該(很多程序員認爲,至少包括我的)很少使用using namespace stdusing std::string。在任何地方使用完整的名稱通常會更好。在全局範圍的頭文件中,使用快捷方式甚至不再是風格問題,但可能導致真正的技術問題。

相關問題