爲什麼在下面的代碼中不包含「string」頭我可以聲明字符串變量。 但是,當我嘗試打印字符串時,編譯器只對cout抱怨。cout爲什麼需要標題字符串?
什麼信息「字符串」標題包含?
#include <iostream>
//#include "string"
int main()
{
std::string str="SomeWorld";
std::cout<<str<<std::endl;
return 0;
}
爲什麼在下面的代碼中不包含「string」頭我可以聲明字符串變量。 但是,當我嘗試打印字符串時,編譯器只對cout抱怨。cout爲什麼需要標題字符串?
什麼信息「字符串」標題包含?
#include <iostream>
//#include "string"
int main()
{
std::string str="SomeWorld";
std::cout<<str<<std::endl;
return 0;
}
因爲定義std::basic_string
的標頭最有可能(間接)包含在<iostream>
(std::string
是基於std::basic_string<char>
的typedef)。然而std::cout
的operator<<
的過載僅在<string>
中定義。
它不是必需的std::cout
,它需要std::string
。
++。不包括「字符串」頭我可以聲明std :: string變量。編譯器允許這樣做。 – vrbilgi
@user - 允許一個C++頭包含任何其他頭文件。你不能依賴這個,因爲它從一個編譯器到另一個不同。你應該總是包含你需要的頭文件。 –
@ user430294:您始終需要一個包含該類型的頭文件。其他一切都是實現的東西,而不是你可以依賴的東西。 –
的<string>
頭包括string
類的定義(注:#include "string"
意味着包括string
文件在當前目錄中,所以你應該使用尖括號而不是"
系統包括。)
然而,iostream
已包含string
(例如,聲明operator<<
適用於std::string
),所以這就是爲什麼您不需要在此情況下包含它的原因。
在任何情況下,包含您剛纔需要的標題是一種很好的做法。這使得您的代碼更具可移植性,並且在您將代碼複製到另一個上下文中的情況下更加明確,例如,不包括iostream
作爲之前的包含。此外,請注意,從未指定,例如,包括iostream
將使std::string
可用,因此嚴格來說,您必須包含string
才能使用std::string
。
嚴格地說,除非你包含全部正確的標題,否則任何事情都可能發生。沒有必要將一個標準頭文件包含在其他文件中。所以要便攜和正確的,你要這樣說:
#include <string> // for `std::string`
#include <ostream> // for `std::ostream &` in `operator<<`
#include <iostream> // for std::cout
int main() {
std::string str = "hello world";
std::cout << str << std::endl;
}
在任何實際的實現,你可以幾乎總是與省略某些標題脫身(如ostream
很可能已被列入iostream
),但以上是符合標準的方式。
在Visual C++的情況下,''包含實現定義的''頭,它定義了'basic_string'本身,但是像你說的那樣,它沒有定義'operator <<'。 –
Sven