1、默認構造函數
C++ 默認構造函數是對類中的參數提供默認值的構造函數,一般情況下,是一個沒有參數值的空函數,也可以提供一些的默認值的構造函數,如果用戶沒有定義構造函數,那么編譯器會給類提供一個默認的構造函數,但是只要用戶自定義了任意一個構造函數,那么編譯器就不會提供默認的構造函數,這種情況下,容易編譯報錯,所以正確的寫法就是用戶在定義構造函數的時候,也需要添加一個默認的構造函數,這樣就不會造成編譯報錯。
如:用戶自定義的默認構造函數
class Test2、為什么要添加默認的構造函數
{
public:
Test(){} // default constructor
} ;
原因如下:
1、當用戶定義了數組,而數組的元素類型是類等對象1,那么這個時候就會調用默認的構造函數,如果這個時候對象1沒有定義默認的構造函數,就會報錯。但是如果不是對象類型,是C++的內置數據類型,是不會報錯的。
如:Object array[10];
2、當用戶定義了數組,並用new來動態分配對象1,那么這個時候如果對象1 沒有默認的構造函數,也會報錯,因為new 會調用對象1 的無參默認的構造函數來初始化對象。
如:Object *temp = new Object[10];
3、當用戶使用了標准庫的容器的時候,容器中是類等對象時,這時候會調用對象的默認構造函數進行初始化,如果這個對象的類中沒有定義默認的構造函數,那么就會報錯。
如:vector<Object> vo;
4、一個類A以另外某個類B的對象為成員時,如果A提供了無參構造函數,而B未提供,那么A則無法使用自己的無參構造函數。
下面的代碼將導致編譯錯誤。
class B
{
B(int i){}
};
class A
{
A(){}
B b;
};
int main(void)
{
A a(); // error C2512: 'B' : no appropriate default constructor available
getchar() ;
return 0 ;
}
5、若類A定義了拷貝構造函數,但是沒有定義默認構造函數,那么若B 繼承 A,B在初始化的時候會調用A的默認構造函數,這個時候會報錯。
class A
{
A(const A&){}
};
class B : public A
{
};
int main(void)
{
B b; //error C2512:'B': no appropriate default constructor available
getchar() ;
return 0 ;
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。