2011-11-20 76 views
2

可能重複:
Most vexing parse: why doesn't A a(()); work?
Difference between creating object with() or without初始化對象的與默認的構造

有這樣的代碼:

class MojaKlasa{ 
public: 
    MojaKlasa(){} 
    MojaKlasa(int i){} 
    void fun(){} 
}; 

int main() 
{ 
    MojaKlasa a; 
    a.fun(); 

    MojaKlasa b(1); 
    b.fun(); 

    MojaKlasa c(); // initialize with default constructor 
    //c.fun(); error: request for member ‘fun’ in ‘c’, which is of non-class type ‘MojaKlasa()’ 

    return 0; 
} 
  • 爲什麼對象c有錯誤?
  • 使其工作的方式是什麼?
  • 真的意味着什麼MojaKlasa c() - 它是函數聲明嗎?
+0

Lookup **在C++中最令人生厭的解析**。 –

+0

這不是最令人頭疼的解析,最令人頭痛的解析是,當您嘗試在初始化直接聲明中使用臨時初始化值作爲初始值時。 –

回答

4
MojaKlasa c(); 

聲明一個名爲c返回MojaKlasa功能,它不是一個對象聲明。如果你想聲明一個本地對象,你需要省略括號。這只是一種語言規則,編譯器必須將此表單解釋爲函數聲明。

MojaKlasa c; 
2
MojaKlasa c(); 

定義了一個函數返回一個MojaKlasa對象。

MojaKlasa c; 

定義了一個類型爲MojaKlasa的對象c。