复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103#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++关于类结构体大小和构造顺序,析构顺序内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复