2012-03-07 108 views
0

如果我有以下類:C++構造差異

class A{ 
private: 
    int x; 
public: 
    A(){ 
    x = 5; 
    } 
}; 

請告訴我這些2點聲明之間的差異?

A a; 

A a(); 

感謝。

回答

8
A a; 

這將創建A類型的對象,並調用默認的構造函數。

A a(); 

聲明一個稱爲a函數,返回A類型的對象。

+2

也被稱爲最令人頭痛的解析。 – 2012-03-07 22:12:10

+1

我見過用來描述'A a(B());'這句話的「最令人頭疼的解析」。我還沒有看到它用來描述'A a();',但也許這也很重要。 – interjay 2012-03-07 22:14:47

+0

這是消歧規則,喜歡函數聲明其他任何東西。 – 2012-03-07 22:15:48

2

第二個代碼沒有定義稱爲a一個對象,它聲明瞭一個函數a與返回類型A沒有參數。 C++編譯器的這個屬性通常被稱爲most vexing parse

2
A a; 

這聲明A類的元素,並使用默認構造函數構造它。

A a(); 

聲明一個稱爲a不採取任何參數和返回A類型的對象的功能。

3

也許是有趣的,除了其他人所說,有以下兩行之間的差異:

A a; 
A a{}; // Using uniform initialization from C++11 to avoid the ambiguity 

而且還有以下兩行之間:

A* a = new A; 
A* a = new A(); // or new A{} 

在每個示例的第一行中,對象都是默認初始化的。在第二行中,該對象進行了值初始化。不同之處在於,雖然默認初始化將調用A的默認構造函數,但值初始化將首先初始化對象,然後調用默認構造函數(如果沒有用戶提供的構造函數)。

對於不是類類型的任何內容,默認初始化將不執行初始化。對於任何不是類類型的或沒有用戶提供的構造函數的聯合,值初始化將對對象進行初始化。