2013-06-28 39 views
1

爲了更明確一些,當我使用()創建對象時嘗試訪問實例變量時出現編譯時錯誤,但是當我沒有時,代碼編譯並按預期方式運行。另外,這個問題只適用於默認的構造函數。 我想明白爲什麼。Object b();有什麼區別?和對象b;?

using namespace std; 
#include <iostream> 

class Student { 

    public: 

    int gpa; 

    Student() { 
     gpa = 4; 
    } 

    Student(int x) { 
     gpa = x; 
    } 

}; 

int main() { 

    Student zero; 
    Student sally(2); 
    Student jack(); 

    cout << zero.gpa << endl; //prints 4 
    cout << sally.gpa << endl; // prints 2 
    cout << jack.gpa << endl; //error: request for member 'gpa' in 'jack', which is of non-class type 'Student()' 

} 
+0

你爲什麼不使用新的? –

+0

這不是嘗試解決問題的問題。我想了解爲什麼我首先遇到了錯誤。 –

+4

@huseyintugrulbuyukisik他爲什麼要呢?只要適用,自動生命週期就會跳過動態生命週期。 – delnan

回答

8

的問題是,Student jack();聲明的函數與Student作爲返回類型。它沒有像你期望的那樣聲明這個類的一個對象。

+0

哦!這太微妙了。我認爲它有一些與此相關的內容,但不確定。謝謝。 –

6
Student jack(); 

聲明瞭一個返回student並且不帶參數的函數。不是一個對象!

見這種gotw

3

多個 「對象B();」聲明一個函數b()返回一個Object類型的對象,而「Object b;」定義一個Object類型的變量b。

不,它並不明顯,如果我在C++,Java和C#之間切換,它仍然會反過來咬我。 :-)

2

Object b();)之間的區別是什麼?和對象b;?

存在差異是因爲C++將其解釋爲正在聲明的函數,而不是正在創建的對象。

Object b; 

這是默認的構造的手段正在創建Object類的對象b

Object b(); 

這是函數b(),被宣佈(它將被別處定義)返回Object類的一個對象,並沒有參數。

希望這會有所幫助。

0

我會嘗試這個

類學生{

市民:

int gpa = 4; 

Student() { }; 
相關問題