相信對C++有過了解的人都知道,類的默認構造方法。就是當定義一個類時,有時編譯器會給類添加一個默認的構造方法。那麼疑問來了,什麼情況下編譯器會給類添加默認構造方法,這些構造方法具體做了什麼操作?下面來探討一下:
1.類裏面有類成員數據,且類成員有構造方法
class A{
public:
A(){}
int a;
};
class B{
public:
int b;
A aa;
};
B b;
此時編譯器會給B類添加默認構造函數,且這個構造函數會調用A的構造函數;因爲當實例化B對象時,類成員aa也需要被實例化,需要調用構造方法。如果編譯器不給B添加這樣的構造方法,那麼A的構造方法將不會被調用,顯然不合理。
2.類成員函數含有虛函數
class A{
public:
int a;
virtual void fun1(){
cout<<"this is virtual function"<<endl
}
};
對於這樣的類A,編譯器也會添加默認構造方法,爲什麼呢?上節已說過,類對象內存空間只有非靜態數據成員和虛函數指針,如果一個類有虛函數那麼這個類一定會有一個虛函數指針來指向虛函數表。那麼這個虛函數指針就是在構造方法中產生。
3.父類含有構造方法
class A{
public:
A(){}
int a;
};
class B:A{
public:
int b;
};
此時對於B類編譯器會添加一個沒有參數的默認構造方法,這個構造方法會調用A的構造方法。
4.類中含有虛基類
class Base{
public:
int m_base_i;
};
class Derived1:virtual Base{
};
class Derived2:virtual Base{
};
class A:public Derived1,public Derived2{
};
這裏實例化A會調用默認構造函數,對虛基類表指針進行賦值,通過虛基類來訪問基類成員。