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; }
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注海外IDC网的更多内容!