C++關(guān)于類結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測試詳解
更新時間:2021年08月25日 11:04:27 作者:yunshouhu
這篇文章主要介紹了C++類結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
#include <iostream>
using namespace std;
/**
1. c++的類中成員若不加修飾符的話,默認是private
2. 調(diào)用構(gòu)造函數(shù)時,先遞歸調(diào)用最頂級的父類構(gòu)造函數(shù),再依次到子類的構(gòu)造函數(shù)。
3. 調(diào)用析構(gòu)函數(shù)時相反,先調(diào)用最底層的子類析構(gòu)函數(shù),再依次到父類的構(gòu)造函數(shù)。
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;//純虛函數(shù)會存在一個虛函數(shù)指針。64bit系統(tǒng)上故大小為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{
//繼承的類中有虛函數(shù),存在一個虛函數(shù)指針,64bit系統(tǒng)上占8字節(jié)
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++關(guān)于類結(jié)構(gòu)體大小和構(gòu)造順序、析構(gòu)順序的測試。
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;//虛函數(shù)會存在一個虛函數(shù)指針。64bit系統(tǒng)上故大小為8
cout<<"sizeof(D)="<<sizeof(D)<<endl;//大小為1,非虛函數(shù)不占用類大小。
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;
}
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
您可能感興趣的文章:
- C++中結(jié)構(gòu)體的類型定義和初始化以及變量引用
- C++動態(tài)分配和撤銷內(nèi)存以及結(jié)構(gòu)體類型作為函數(shù)參數(shù)
- C++中聲明類的class與聲明結(jié)構(gòu)體的struct關(guān)鍵字詳解
- C++結(jié)構(gòu)體struct和類class區(qū)別詳解
- C++結(jié)構(gòu)體與類指針知識點總結(jié)
- C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換
- C++結(jié)構(gòu)體與類的區(qū)別詳情
- C++?中的?JSON?序列化和反序列化及結(jié)構(gòu)體與枚舉類型的處理方法
- C++ 中類(class)和結(jié)構(gòu)體(struct)的區(qū)別
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)之棧簡單操作
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之棧簡單操作的相關(guān)資料,需要的朋友可以參考下2017-06-06
C++11關(guān)于auto關(guān)鍵字的使用示例
今天小編就為大家分享一篇關(guān)于C++11關(guān)于auto關(guān)鍵字的使用示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

