2013-04-01 39 views
2

我知道你不能在不使用構造函數的情況下直接在類內初始化成員變量(除了靜態常量)。爲什麼你不能初始化類中的變量在c + +中

但只是想知道背後的原因是什麼。下面 是代碼片段

,如果任何機構可以幫助

class a 
{ 

    int c=5; 

// giving error error C2864: 'a::c' : only static const integral data members can be 

// initialized within a class 

    int b; 


public: 
    a():c(1),b(2){} 

    void h() 
    { 
     printf("%d,%d",c,b); 
    } 
}; 

int main() 
{ 

    a l; 

    l.h(); 

    getchar(); 
} 
+0

我的意思是,不同的語言有不同的限制...不知道你要找什麼樣的答案。在C++中,實例特定的初始化必須位於構造函數或其初始化列表中。 – jedwards

+0

可能的重複[爲什麼我不能在類中有一個非整型靜態const成員?](http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral- static-const-member-in-a-class) –

+0

@jedwards我想知道爲什麼不允許直接初始化實例。 – hims15

回答

1

類定義主要是想告訴其他類什麼接口的類將有它的內存佔用,以及任何價值與編譯時已知的類關聯(即常量)。在類定義中沒有可執行代碼(儘管在類定義中定義的函數中可能有可執行代碼)。將執行的代碼位於函數本身的定義中。

編輯:顯然這是在C++ 11中支持的。

+0

在類定義中可以有可執行代碼,只要它在函數定義中(如問題的示例中)。 –

+0

你是對的,謝謝。我編輯了我的答案,希望能更好地解釋。 – maditya

4

其實你可以。但僅限於C++ 11。

下面是一個有效的C++代碼11:

class A 
{ 
    int x = 100; //valid in c++11 
}; 

你的編譯器可能不支持這一點,但GCC 4.8.0 compiles it fine

希望有所幫助。

+1

+1打敗了我,但哪個編譯器支持這個? –

+0

@ArmenTsirunyan,GCC和Clang呢。 – chris

+0

@Armen:它是[GCC 4.8.0](http://coliru.stacked-crooked.com/view?id=8c0efcb8cc51f614370b5735b9388d86-61c3814520a8d4318f681038dc4b4da7) – Nawaz

相關問題