string頭文件和string.h頭文件是一樣的?
我在書里看到這一段:
C++ primer 5th P67
為了確保各個文件中類的定義一致,類通常被定義在頭文件中,而且類所在頭文件的名字應與類的名字一樣。例如,庫類型string在名為string的頭文件中定義。又如,我們應該把Saels_data類定義在名為Saels_data.h的文件中。
......頭文件也經常用到其它頭文件的功能。例如,我們的Sales_data類包含有一個string成員,所以Sales_data.h必須包含string.h頭文件。同時,使用Sales_data類的程序為了能操作bookNO成員需要再一次包含string.h頭文件。
查到的一篇文章:
頭文件string與string.h的區別 - compilerTech - 博客園
我的問題:
1.我不是很理解C++ primer中的那段話,string頭文件和string.h頭文件不是同一個東西?
查到的那篇文章的意思是確實不是同一個東西。string是一個類,string.h是c遺留的東西,按這個理解書里的那段話,string.h是一種對成員執行操作的頭文件,可是感覺不對啊,既然是操作,不應該是
「我們的Sales_data類包含有一個string成員,所以Sales_data.h必須包含string頭文件。同時,使用Sales_data類的程序為了能操作bookNO成員需要再一次包含string.h頭文件」這樣才對么?
2.是不是系統類都是沒有.h,自己定義的類都必須有.h。以此來區分自己定義的和系統自帶的類?
對於你現在寫的C++來說不是一個東西。
string頭文件指的是&
string.h頭文件的話指的是C語言風格的字元串相關庫的頭文件——在C++中一般寫作&#include&
#include&
using namespace std;
int main()
{
string str1,str2;
cin&>&>str1&>&>str2;
cout&<&
#include&
#include&
int main() {
char hello[100] = "hello ";
char world[100] = "world";
printf("%s
", hello);
strcat(hello,world);
printf("%s
",hello);
return 0;
}
C 的 &
C++ 的 Standard library header &
C++ 的標準庫頭文件都是沒 .h 後綴的,含 .h 後綴的都是被廢棄的(deprecated)。
iostream.h和string.h在Windows上已經是上個世紀的東西了,早就淘汰了,你不用管,就當沒有iostream.h和string.h存在過。
當然書裡面提到過的string.h可能不是我說的這個string.h,但是iostream.h肯定是我說的iostream.h。
http://zh.cppreference.com/w/cpp/header
C++ 標準庫頭文件的說明看這裡,雖然描述可能有一些不精確。個人理解是 C++ 傾向標準庫頭文件無後綴,而第三方庫頭文件使用 .h/.hpp 後綴。來自 C 的頭文件都換了 cxxxx 的馬甲,可能是因為寫成 xxxx.h 就顯得像非標準庫。
string.h在c++中指的是cstring這個頭文件,就是有strlen等一系列函數的頭文件。在c++中,建議這樣寫#include&
「string.h」和「cstring」是一個東西,「string」比「cstring多了一個字元串類型,但是我用到現在,似乎「string」里包含了幾乎所有的「cstring」的函數。
另外,大多數情況下,「xxx」和「xxx.h」是一樣的,但是因為c++的自帶函數庫實在是有點多,所以經常會有程序員把自己的頭文件命名的和自帶的頭文件一樣。為了避免這些愚蠢的錯誤,所以「xxx.h」會優先檢索是否有自己寫的頭文件,之後是c標準庫,之後在檢索cpp標準庫頭文件。「cxxx」會優先檢索c標準庫,然後「xxx」會優先檢索cpp標準庫。
再加一句話。這個命名方式就代表著會有一系列的同名頭文件。「string」是寫在代碼里的,但是文件名叫做「string.h」;「cstring」是寫在代碼里的,但是頭文件名也叫「string.h」;如果你在自己寫一個頭文件,也可以命名為「string.h」,三個文件名稱是一樣的。看了你的問題,特意查了查書,你看書挺仔細的發現了這個問題,但是你咋不看看 Sales_data.h的定義呢,要動手查查啊。在Sales_data.h的定義中只是用到了 std::string,這個明顯是定義於 &
簡單來說 帶.h的都是c語言遺留下來的庫 不帶.h的是c++新有的庫 c++可以兼容c但是反過來不行另外c++primer對於零基礎來說還是有點難 可以再買一本c++primer plus看 這個更通俗易懂 兩本互相對照著學比較好
string.h約等於cstring
string就是string
前者是c的字元串處理函數頭文件,後者是c艹的std::string類的頭文件。
學語言別計較這些細微的東西,先知道,然後用。過段時間你會發現,哦,原來如此。
cstring = string.h
根據不知道哪裡來的標準規定標準庫里.h後綴表示c的標準庫(僅限純c編譯環境),沒有.h的是c++的標準庫,不過實際來看的話,如果c++ include c的標準庫也只是為了方便用c裡面的函數(然而c++的標準庫功能更多更方便用。),但是編譯方式一定是按照c++的編譯方式。
推薦閱讀: