从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(中文企业版) // 这三个编译器上编译经过 //====================================================================