2011-03-31 110 views
15

我的問題很簡單。我們什麼時候需要一個默認的構造函數? 請參考下面的代碼:我們什麼時候需要一個默認構造函數?

class Shape 
{ 
    int k; 

public: 
    Shape(int n) : k(n) {} 
    ~Shape() {} 
}; 

class Rect : public Shape 
{ 
    int l; 

public: 
    Rect(int n): l(n) 
    {}  //error C2512: 'Shape' : no appropriate default constructor available 

    ~Rect() {} 
}; 
  1. 爲什麼編譯器不要隱式的類矩形產生零參數的默認構造函數?根據我的知識,如果一個類(Rect)從具有默認構造函數(隱式生成或顯式提供)的另一個類(Shape)派生,則默認構造函數應該由編譯器生成。

+0

構建Rect對象並使用它的部分在哪裏?可能你創建它像'Rect rec;'它需要一個默認的構造器。 – RvdK 2011-03-31 11:17:52

+0

IIRC如果你沒有指定一個構造函數,編譯器會爲你創建一個默認的構造函數。但是如果你指定一個,它只會有一個。 – RvdK 2011-03-31 11:19:19

+0

ctor ==構造函數...... ahhhh! – 2011-03-31 11:20:15

回答

16

如果使用參數創建了自己的構造函數,則不會合成默認構造函數。既然你給Shape自己的構造函數,你必須現在明確地寫出一個默認的構造函數Shape

class Shape 
{ 
     int k; 

    public: 
     Shape() : k(0) {} 
     Shape(int n) : k(n) {} 
     ~Shape() {} 
}; 

(你可以離開了空~Rect() {}定義,因爲這些將被合成。)

但是,它看起來像我不喜歡想要 Shape的默認構造函數在這裏。有Rect正確構建Shape基地:

​​

另外請注意,這個例子是oft cited as an abuse of OO。考慮你在這裏是否需要繼承真的

+0

@Shammel:對不起,所有這些評論者都拒絕了你的修改;我不知道他們爲什麼這樣做。如果您想再次提出編輯建議,我會接受它。謝謝! – 2015-01-07 15:09:26

11

如果沒有定義其他構造函數,只有編譯器自動生成默認構造函數。不管任何繼承。

,你也需要通過調用來構建你的基類:

Rect(int n) : Shape(n), l(n) 
{ 
} 
0

默認構造函數只有在你還沒有定義任何其他構造函數生成。

假設,如果你需要在類中進行一些特殊的初始化,默認的構造函數不會做正確的事情。

1

當且僅當您未明確聲明任何ctors時,編譯器纔會定義默認ctor。

請注意,重要的是聲明構造函數,不一定定義它。例如,聲明一個私有的ctor並且從不定義它是相當普遍的,以防止編譯器隱式地定義其他的。

編輯:另請注意,C++ 11有一個=default語法來處理像你這樣的情況。

0

當你爲Shape定義一個Constructor來期待一個整數時,你已經覆蓋了默認構造函數。所以如果你擴展Shape,你必須傳遞一個整數值給超類。

0

編譯器會在未定義任何構造函數的情況下生成默認構造函數。但是如果你定義了任何需要一些參數的構造函數。編譯器將使用該構造函數,並且不會生成具有零參數的默認構造函數。

相關問題