这篇文章主要讲解了“C++类结构体的大小和构造顺序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++类结构体的大小和构造顺序”吧!
#include <iostream> using namespace std; /** 1. c++的类中成员若不加修饰符的话,默认是private 2. 调用构造函数时,先递归调用最顶级的父类构造函数,再依次到子类的构造函数。 3. 调用析构函数时相反,先调用最底层的子类析构函数,再依次到父类的构造函数。 4. 空类的sizeof(A)大小为1,多个空类继承后的子类大小也是1 */ class A{ public: A() { cout<<"A constructor"<<endl; } ~A() { cout<<"A destructor"<<endl; } }; class B:A{ public: B() { cout<<"B constructor"<<endl; } ~B() { cout<<"B destructor"<<endl; } }; class C:B{ public: C() { cout<<"C constructor"<<endl; } ~C() { cout<<"C destructor"<<endl; } virtual void eat()=0;//纯虚函数会存在一个虚函数指针。64bit系统上故大小为8 }; class D:B{ void eat() { cout<<"D eat"<<endl; } }; class E:B{ int age;//不加修饰符的话,默认是private public: int num; E(int a,int b):age(a),num(b){ cout<<"E constructor"<<endl; }; ~E() { cout<<"E destructor"<<endl; } void eat() { cout<<"E eat"<<endl; } }; class F:C{ //继承的类中有虚函数,存在一个虚函数指针,64bit系统上占8字节 int age;//不加修饰符的话,默认是private public: int num; F(int a,int b):age(a),num(b){ cout<<"F constructor"<<endl; }; ~F() { cout<<"F destructor"<<endl; } void eat() { cout<<"F eat"<<endl; } }; //C++关于类结构体大小和构造顺序、析构顺序的测试。 int main() { cout<<"run"<<endl; cout<<"sizeof(A)="<<sizeof(A)<<endl;//大小为1 cout<<"sizeof(B)="<<sizeof(B)<<endl;//大小为1 cout<<"sizeof(C)="<<sizeof(C)<<endl;//虚函数会存在一个虚函数指针。64bit系统上故大小为8 cout<<"sizeof(D)="<<sizeof(D)<<endl;//大小为1,非虚函数不占用类大小。 cout<<"sizeof(E)="<<sizeof(E)<<endl;//大小为4+4 E e(11,22); cout<<"e.num="<<e.num<<endl; E* e2=new E(33,44); cout<<"e2->num="<<e2->num<<endl; delete e2; cout<<"sizeof(F)="<<sizeof(F)<<endl;//大小为8+4+4 F f(55,66); cout<<"f.num="<<f.num<<endl; f.eat(); return 0; }
感谢各位的阅读,以上就是“C++类结构体的大小和构造顺序”的内容了,经过本文的学习后,相信大家对C++类结构体的大小和构造顺序这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。