我知道string
類型存在於namespace std
中。我也知道有<string>
庫需要包括在內,才能使用string
類型。我的問題是:爲什麼我需要兩個(包括庫和使用std命名空間)來定義一個字符串?爲什麼不能通過包含庫來使用它?更一般地說,namespace std
包含庫中缺少的是什麼?爲什麼我需要std和string庫在C++中使用字符串
2
A
回答
2
命名空間和頭部是兩個不同的概念做完全不同的事情:
- 頭
<string>
聲明相關的字符串庫類似類模板std::basic_string
的各種實體,一些typedef
就像std::string
和std::wstring
,有的功能。 - 命名空間用於分組相關功能並允許在不同名稱空間中使用相同的名稱。例如,「向量」本質上是一些數組(這是由標準C++庫在名稱空間
std
中定義該名稱的視圖),而在其他上下文中則是數學實體。
當您包含<string>
時,您獲得了與在名稱空間std
內聲明的字符串庫相關的所有實體。有些人反對使用std::string
的想法,因爲它更容易使用string
代替。爲了幫助實踐使用指令,即,當查找名稱時,可以使用諸如using namespace std;
之類的語句來查看名稱空間std
中的實體。也就是說,使用指令只是使名稱不受限制。
2
這樣看待:std::string
是完整名稱的類型,很像「M. Kostas」是您的完整名稱。
#include <string>
給出std::string
。只有在您首先確定了正確的上下文後,才能將其稱爲string
。通過using namespace std
或using std::string
,或者如果您自己碰巧是namespace std { /* ... */ }
內的庫代碼。
再次,考慮與姓氏的類比。我只能通過「M.」來提及你。如果我首先確定我正在談論「Kostas」家族(= using namespace std
),或者如果我先前用「M.」來表示。我實際上是指「M. Kostas」(= using std::string
),或者如果我自己是「Kostas」家族的成員(= namespace std { /* ... */ }
)。
請注意,您應該(很多程序員認爲,至少包括我的)很少使用using namespace std
或using std::string
。在任何地方使用完整的名稱通常會更好。在全局範圍的頭文件中,使用快捷方式甚至不再是風格問題,但可能導致真正的技術問題。
相關問題
- 1. C++爲什麼的std :: string比C字符串
- 2. 爲什麼C++字符串需要\ 0?
- 3. 爲什麼C++字符串不需要std :: forward來調用所需的函數?
- 4. 爲什麼需要用std :: string :: operator +()顯式調用Myclass :: operator string()?
- 5. C++,爲什麼使用const std :: string&parameterName?
- 6. 我需要什麼庫來使用std ::佔位符?
- 7. 爲什麼在#include <string>之後仍然需要使用std :: string?
- 8. 爲什麼std :: fstream類不需要std :: string?
- 9. 爲什麼我們需要綁定std :: cin和std :: cout?
- 10. 爲什麼需要std :: minmax_element?
- 11. 爲什麼我被要求將xml中的字符串作爲@string引用?
- 12. 在C++中將std :: string轉換爲Unicode字符串
- 13. 轉換系統:字符串^(C#字符串)到C++的std :: string
- 14. 爲什麼我需要在Javascript中使用字符串替換時添加/ g?
- 15. 爲什麼我們需要在getline(cin,string)之前使用cin.ignore()?
- 16. 爲什麼我不需要使用scanf符號? (在C)
- 17. 將boost std :: string :: const_iterator轉換爲字符串和int C++
- 18. 爲什麼我不能在libcurl中使用std :: string?
- 19. 簡單的問題:爲什麼字符串庫函數std :: string :: find總是返回std :: string :: npos?
- 20. 從std :: string轉換爲字符串^
- 21. 爲什麼我需要清除一個字符串流變量在使用它
- 22. 將C風格的字符串轉換爲C++ std :: string
- 23. objective-c字符串:爲什麼你不需要setter/getter?
- 24. C++ std :: string和string
- 25. C中有符號和無符號字符需要什麼?
- 26. 爲什麼我不能std :: string?
- 27. 爲什麼我的std :: string被截斷?
- 28. 爲什麼我不能用std :: remove_if從std :: set中刪除一個字符串?
- 29. 爲什麼這個std :: map鍵提取函數需要--std = C++?
- 30. 使用std :: sscanf和std :: string的C++
你不需要使用'using namespace std;'。您可以使用該類型直接限定名稱空間。只要寫'std :: string s;'即可。 –
@Martin:'string'不是模板類,'basic_string'是。 –