2016-04-12 132 views
0

我混淆了默認的構造函數。 我有2碼,代碼A和代碼B爲什麼這不被視爲默認的構造函數?

在代碼。我不明白爲什麼A(int news)不被視爲默認的構造函數,而代碼B ParentClass(int id)是考慮作爲默認的構造函數

爲什麼代碼中的ISN」能夠編譯但代碼B能夠編譯。

碼A

class A{ 
public: 
    int s; 
     A(int news){ 
s = news; 
} 
    void print() 
    { 
    cout << s; 
    } 
}; 


int main() 
{ 
    A a; 
    a.print(); 

} 

代碼B

class ParentClass{ 
public: 
    int id; 
    ParentClass(int id){ 
    this->id = id; 
    } 

    void print(){ 
     cout << id <<endl; 
    } 
}; 

class ChildClass:public ParentClass 
{ 
public: 
    int id; 
    ChildClass(int id):ParentClass(1) 
    { 
     this->id = id; 
    } 
}; 

int main() 
{ 
    ChildClass c(2); 
    c.print(); 
} 

回答

5

編輯後,最後的問題變得清晰。重新說明我的答案。

前言。在C++中,默認的構造函數是一個沒有參數的構造函數,或者它的所有參數都有默認值。當沒有提供附加信息時,它用於創建對象。例如,

Default a; 
Default* p = new A; 

在上面的代碼中,Default默認構造函數被調用。

在示例A中,您試圖調用默認構造函數A - 因爲A a調用A的默認構造函數。由於這樣的構造函數不存在,你有一個編譯錯誤。你所擁有的唯一的構造是一個取整數參數,你可以用下面的代碼來調用它:

A a(42); 

在第二個例子,你在呼喚 -default(用戶提供)構造ChildClass - becasue ChildClass c(1)調用一個構造函數ChildClass接受一個整數參數 - 你就是這樣。順便說一句,這個ChildClass構造函數調用ParentClass構造函數,它只需要一個整數參數。

+0

所以代碼A有一個非默認的構造函數嗎?爲什麼當我運行它時,它會說沒有默認構造函數?而代碼B則會運行。 – overflowhow

+2

@overflowhow,你要運行哪個* code *? – SergeyA

+0

我的意思是,如果我運行代碼A,它會給出錯誤,說默認的構造函數沒有定義。但是,當我運行代碼B它運行成功..另一個問題,是必須有默認的構造函數? – overflowhow

相關問題