C++ 默認構造函數的重要性


1、默認構造函數

C++ 默認構造函數是對類中的參數提供默認值的構造函數,一般情況下,是一個沒有參數值的空函數,也可以提供一些的默認值的構造函數,如果用戶沒有定義構造函數,那么編譯器會給類提供一個默認的構造函數,但是只要用戶自定義了任意一個構造函數,那么編譯器就不會提供默認的構造函數,這種情況下,容易編譯報錯,所以正確的寫法就是用戶在定義構造函數的時候,也需要添加一個默認的構造函數,這樣就不會造成編譯報錯。

如:用戶自定義的默認構造函數

class Test
{
public:
Test(){}
// default constructor
} ;
2、為什么要添加默認的構造函數

原因如下:

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 ;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com