C++默認構造函數


默認構造函數

默認的構造函數是指為所有參數都提供了默認值的構造函數,通常是指無參的構造函數。比如下面的類Test,它的默認構造函數就是Test()。

class Test
{
public:
    Test(){} // default constructor
} ;

如果你沒有為你的類提供任何構造函數,那么編譯器將自動為你生成一個默認的無參構造函數。一旦你為你的類定義了構造函數,哪怕只是一個,那么編譯器將不再生成默認的構造函數。

為你的類提供默認的構造函數

有很多原因,列舉如下:

1. 當你使用靜態分配的數組,而數組元素類型是某個類的對象時,就要調用默認的構造函數,比如下面的代碼。

Object buffer[10]; // call default constructor

2. 當你使用動態分配的數組,而數組元素類型是某個類的對象時,就要調用默認的構造函數,比如下面的代碼,如果Object沒有默認的構造函數,是無法通過編譯的,因為new操作符要調用Object類的無參構造函數類初始化每個數組元素。

Object* buffer = new Object[10];

3. 當你使用標准庫的容器時,如果容器內的元素類型是某個類的對象時,那么這個類就需要默認的構造函數,原因同上。

vector<Object> buffer;

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

再比如下面的代碼,類A定義了拷貝構造函數,而沒有提供默認的構造函數,B繼承自A,所以B在初始化時要調用A的構造函數來初始化A,而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 ; 
} 

==

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM