2012-10-02 45 views
7

可能重複:
Why is there no call to the constructor?測試t之間的區別是什麼;和Test t();?如果測試是一類

我使用Visual Studio 2012,假設測試是一類

class Test 
{ 
}; 

當我創建一個新的實例的測試,以下兩種方式有什麼區別?

方式1

Test t; 

方式2

Test t(); 

我在下面的代碼這個問題,原來,我在方式2中定義A的一個實例,我只有一個錯誤,因爲乙沒有提供默認的構造函數,但是當我以方式1定義它時,我得到了一個額外的錯誤。

class B 
{ 
    B(int i){} 
}; 

class A 
{ 
    A(){} 
    B b; 
}; 

int main(void) 
{ 
    A a(); // define object a in way 2 

    getchar() ; 
    return 0 ; 
} 

如果我的方式定義1

A a; 

我會得到另一個錯誤說

錯誤C2248: 'A :: A':不能訪問類中聲明私有成員 'A'

所以我想必須有一些差異兩種方式。

回答

50

enter image description here

Test t;定義了一個名爲Test類型的t變量。

Test t();聲明瞭一個名爲t的函數,它不接受參數並返回Test

+20

+1的圖片:-) –

+1

好,多麼愚蠢的問題,我相信我之前知道,但今天......這不是我的日子,:( – zdd

+0

@zdd它發生。 –

17

兩個聲明之間的區別是什麼?

A a(); 

聲明的函數,而不是一個對象。它是C++中的Most vexing parse之一。
它通過名稱a聲明一個函數,該函數不接受參數並返回A類型。

A a; 

通過調用其默認構造函數創建一個名爲類型Aa對象。

爲什麼你得到編譯錯誤?

對於類的默認訪問說明符是private如此,因爲你的類的構造函數是private,並同時創造與上述語法的目的就不能叫你得到的錯誤。

+0

非常感謝你。 – zdd

相關問題