2013-04-01 2 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

Возможный дубликат [Почему я не могу иметь нецелый элемент static const в классе?] (Http://stackoverflow.com/questions/370283/why-canti-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 do. – chris

+0

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

Смежные вопросы