如果我有以下類:C++構造差異
class A{
private:
int x;
public:
A(){
x = 5;
}
};
請告訴我這些2點聲明之間的差異?
A a;
與
A a();
感謝。
如果我有以下類:C++構造差異
class A{
private:
int x;
public:
A(){
x = 5;
}
};
請告訴我這些2點聲明之間的差異?
A a;
與
A a();
感謝。
A a;
這將創建A
類型的對象,並調用默認的構造函數。
A a();
聲明一個稱爲a
函數,返回A
類型的對象。
第二個代碼沒有定義稱爲a
一個對象,它聲明瞭一個函數a
與返回類型A
沒有參數。 C++編譯器的這個屬性通常被稱爲most vexing parse。
A a;
這聲明A
類的元素,並使用默認構造函數構造它。
A a();
聲明一個稱爲a
不採取任何參數和返回A
類型的對象的功能。
也許是有趣的,除了其他人所說,有以下兩行之間的差異:
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的默認構造函數,但值初始化將首先初始化對象,然後調用默認構造函數(如果沒有用戶提供的構造函數)。
對於不是類類型的任何內容,默認初始化將不執行初始化。對於任何不是類類型的或沒有用戶提供的構造函數的聯合,值初始化將對對象進行初始化。
也被稱爲最令人頭痛的解析。 – 2012-03-07 22:12:10
我見過用來描述'A a(B());'這句話的「最令人頭疼的解析」。我還沒有看到它用來描述'A a();',但也許這也很重要。 – interjay 2012-03-07 22:14:47
這是消歧規則,喜歡函數聲明其他任何東西。 – 2012-03-07 22:15:48