從C到C++,結構體(struct)涅槃重生,那麼,C語言的結構體和C++結構體有什麼不一樣呢,下面是一個測試程序,程序中大量的註釋就算做本文的講解吧!ios
/*- ========================================================== * 文件名 :TestCppStruct.cpp * 開發人員:袁培榮 * 當前版本:1.0.0.2595 * 建立時間:2012-05-17 * 修改時間:2012-05-17 * 功能說明:C++結構體功能測試 * 版權說明:版權全部 袁培榮 YuanPeirong * 編譯環境:Windows 7(x64) SP1 簡體中文專業版 * 編譯器: Visual Studio 2010 SP1(中文旗艦版) MinGW 20111108 Visual C++ 6.0 SP6(中文企業版) - ==========================================================*/ #include <iostream> using std::cout; using std::endl; //==================================================================== struct STest { int a; char c; STest() { cout<<"STest結構體構造函數被執行"<<endl; a=10; c='S'; }; }; //==================================================================== struct STest2 { int a; char c; STest2(); }; STest2::STest2() { cout<<"STest2結構體構造函數被執行"<<endl; a=15; c='T'; } //==================================================================== struct STest3 { int a; char c; void Test() { cout<<"STest3結構體Test函數被執行"<<endl; a=10; c='S'; }; }; //==================================================================== struct STest4 { int a; char c; void Test(); }; void STest4::Test() { cout<<"STest4結構體Test函數被執行"<<endl; a=15; c='T'; } //==================================================================== struct STest5 { int a; void Test(); private: char c; void Test2(); }; void STest5::Test() { cout<<"STest5結構體Test函數被執行"<<endl; a=16; c='X'; } void STest5::Test2() { cout<<"STest5結構體Test2函數被執行"<<endl; a=17; c='Y'; } //==================================================================== int main(int argc, char* argv[]) { //==================================================================== STest s11; //在C語言中應爲 struct STest s11; 在C++中struct可省略 STest2 s21; // cout<<"s11: "<<s11.a<<" "<<s11.c<<endl; cout<<"s21: "<<s21.a<<" "<<s21.c<<endl; s11.a=100; s21.c='Z'; cout<<"直接修改了s11和s21的值!"<<endl; cout<<"s11: "<<s11.a<<" "<<s11.c<<endl; cout<<"s21: "<<s21.a<<" "<<s21.c<<endl; //==================================================================== // C++的結構體有構造函數,C語言中結構體不能有函數,更別談構造函數 //==================================================================== //==================================================================== // STest s12={1,'A'}; // STest s22={2,'B'}; // cout<<"s12: "<<s12.a<<" "<<s12.c<<endl; // cout<<"s22: "<<s22.a<<" "<<s22.c<<endl; //==================================================================== // error: `s12' must be initialized by constructor, not by `{...}' // error: `s22' must be initialized by constructor, not by `{...}' // 結構體一旦有構造函數就不能經過 {...} 方式初始化 //==================================================================== //==================================================================== STest3 s31={1,'A'}; STest4 s41={2,'B'}; cout<<"經過 {...} 方式初始化 了s31和s41的值"<<endl; cout<<"s31: "<<s31.a<<" "<<s31.c<<endl; cout<<"s41: "<<s41.a<<" "<<s41.c<<endl; s31.Test(); s41.Test(); cout<<"s31: "<<s31.a<<" "<<s31.c<<endl; cout<<"s41: "<<s41.a<<" "<<s41.c<<endl; s31.a=100; s41.c='Z'; cout<<"直接修改了s31和s41的值!"<<endl; cout<<"s31: "<<s31.a<<" "<<s31.c<<endl; cout<<"s41: "<<s41.a<<" "<<s41.c<<endl; //==================================================================== // C++的結構體能夠有成員函數 // C++的結構體沒有構造函數時能夠經過 {...} 方式初始化 //==================================================================== //==================================================================== //STest5 s51={5,'A'}; // error: `s51' must be initialized by constructor, not by `{...}' //s51.Test2(); //error: `void STest5::Test2()' is private //s51.c='Z'; // error: `char STest5::c' is private STest5 s52; s52.a=52; cout<<"s52.a="<<s52.a<<endl; s52.Test(); cout<<"s52.a="<<s52.a<<endl; s52.a=10; cout<<"s52.a="<<s52.a<<endl; //==================================================================== // 結構體STest5的測試說明: // C++中能夠爲結構體的成員設定訪問控制級別 private public protected // C++中一旦爲結構體設定訪問控制級別,那麼這個結構體其實就是類 // 因此不能夠經過 {...} 方式初始化 // 類中的訪問控制級別和結構體是一致的,可是缺省時: // 類中是 private 而結構體中是 public // 這是惟一的區別 //==================================================================== return 0; //在C語言和早期C++中此句不能夠省略,在標準C++中此句可省略 } //==================================================================== //運行結果 //==================================================================== // STest結構體構造函數被執行 // STest2結構體構造函數被執行 // s11: 10 S // s21: 15 T // 直接修改了s11和s21的值! // s11: 100 S // s21: 15 Z // 經過 {...} 方式初始化 了s31和s41的值 // s31: 1 A // s41: 2 B // STest3結構體Test函數被執行 // STest4結構體Test函數被執行 // s31: 10 S // s41: 15 T // 直接修改了s31和s41的值! // s31: 100 S // s41: 15 Z // s52.a=52 // STest5結構體Test函數被執行 // s52.a=16 // s52.a=10 //==================================================================== // 總結: C++的結構體能夠分兩部分來看 // 1.保持和C語言兼容的結構體,不涉及函數 // 2.C++支持的結構體,這種結構類事實上和類class功能相同,但有一點區別 // 區別在於 // 類中默認的訪問控制級別爲 private // 結構體中默認的訪問控制級別爲 public // 是的,咱們能夠在編程時用 private public protected來修飾結構體中的成員 // C++的結構體就是C語言的結構體和C++中的類的綜合體 //==================================================================== //==================================================================== // 以上測試的錯誤信息是在MinGW編譯器上編譯時複製的 // 以上代碼在 // Visual Studio 2010 SP1(中文旗艦版) // MinGW 20111108 // Visual C++ 6.0 SP6(中文企業版) // 這三個編譯器上編譯經過 //====================================================================