2012-09-18 95 views
2

可能重複:
Error on calling default constructor with empty set of bracketsc + +聲明一個對象與括號

我具有連接一個測試程序。 問題:

如果我聲明如下,沒有反對創建和 未調用默認構造函數。 'grCell c3();' // bad

但是, 聲明像這樣可以。一個對象被創建並且它的構造函數被調用。 'grCell c1;' // good

'grCell c3()'和'grCell c1'之間的區別是什麼?

謝謝!

託德

// ---- BEGIN -------

#include <iostream> 
#include <cstdio> 

typedef unsigned int uint; 
using namespace std; 

// 
class grCell { 
public: 
    grCell()  { printf("HERE_0\n"); }; 
    grCell(int i) { printf("HERE_1\n"); }; 
    ~grCell() {}; 

    void setX(int x) { _x = x; } 
    // 
    // 
private: 


    int _x:22; 
}; 

int main() 
{ 

    grCell c1; // good 
    c1.setX(100); 


    grCell c3(); // bad 
    c3.setX(100); 

    grCell c2(5); 
    c2.setX(10); 


} 

// ------ END ------

回答

5

grCell c3()grCell c1有什麼區別?

第一聲明的函數,而第二創建名爲類型grCellc1的對象。

grCell c3(); 

它不會創建一個對象,但聲明與不帶任何參數和返回grCell類型的對象名稱c3的功能。
它是C++中的Most vexing parse

+0

然後* next *行會導致編譯器錯誤,因爲'c3'函數沒有'setX()'成員。 –

+0

@GregHewgill:確實:) –

3

您遇到the most vexing parse

grCell c3()聲明瞭一個功能名爲c3它返回一個grCell

grCell c3聲明名爲c3grCell的實例。

在C++中,有一種說法「任何看起來像函數的函數都是函數」。

關於評論

grCell()被稱爲值初始化,既grCell()grCell調用默認的構造函數,如果它是類類型。但是,int()int是不同的,第一個版本零初始化對象。

+0

grCell * p1 = new grCell(); //好吧 grCell * p2 = new grCell; //確定 – user1273456

+0

@ user1273456:'new'是一個C++關鍵字,'new grCell()'在使用'operator ='的表達式的右側,這是不可能的。 –