2009-02-03 108 views
2

我有一個由多個字段組成的類,並且我有幾個構造函數。我也有一個構造函數,它不帶任何參數,但是當我嘗試使用它:構造函數中的奇怪行爲

int main { 
    A a; 
} 

編譯器生成一個錯誤,而如果我用這樣的:

int main { 
    A a(); 
} 

這是好。那是什麼?

謝謝

回答

11

第一main用A的默認構造函數。第二個聲明一個不帶參數並返回一個A值的函數,這可能不是你想要的。

那麼A的定義是什麼樣的,編譯器產生的錯誤是什麼?

哦,你需要在主聲明提供的參數列表:int main() { //...,不int main { //...

2

通過確定你的意思是編譯或它的工作原理?的代碼行:

A a(); 

是一個命名a函數不帶參數,並返回A類型的對象的聲明(或原型)。

我認爲任何人有機會幫助你解決真正的問題,你至少需要發佈class A聲明。

0

你說得對,我有個問題裏面的這個班。

1

Charles和Michael Burr都認定第二個聲明實際上是函數原型而不是A的實例化。

至於可能的原因您的第一個代碼段沒有工作,你會得到一個編譯錯誤,在這種情況下,當:

  1. 類從沒有默認構造函數的基類繼承A; OR
  2. A包含沒有默認構造函數的類型的對象;或
  3. 類別A包含參考成員;

您提供其省略了從初始化器列表,這些子對象的一個​​或多個默認的構造函數。

所有這些子對象都需要一些初始化的方式,編譯器生成的默認構造函數不會這樣做。請注意,在所有情況下,您需要在構造函數的初始化列表而不是主體中初始化它們。