2011-05-24 2 views
6

Следует ли определить элемент static const вне определения класса, даже если он инициализирован внутри класса?определение static const вне определения класса

#include<iostream> 
using namespace std; 
class abc 
{ 
    static const int period=5; 
    int arr[period]; 
    public: 
    void display() 
    { 
     cout<<period<<endl; 
    } 
}; 

const int abc::period; 

int main() 
{ 
    abc a; 
    a.display(); 
    return 0; 
} 

После комментирования // const int abc::period; обе версии кода прекрасно работать на GCC 4.3.4. Поэтому я хочу спросить, почему работают обе версии, а какая стандартная?

ответ

8

Вы - , определяющий статический член period письменно const int abc::period;. Вы можете предоставить инициализатор класса в классе static const, но это не определение, но это просто объявление.

9.4.2/4 - Если статический член данных имеет сопзЬ интегрального или сопзИте типа перечисления, его объявление в определении класса можно указать константу-инициализатор, который является неотъемлемым константным выражением (5.19). В этом случае член может фигурировать в интегральных постоянных выражениях. Член все еще должен быть определен в области пространства имен, если он используется в программе, и определение области пространства имен не должно содержать инициализатор.

Ваш код компилируется даже без определения, потому что вы не берете адрес статического члена. Бьерн Страуструп упоминает в C++ - FAQ here что Вы можете взять адрес статического члена, если (и только если) оно имеет вне класса определения

+0

+1 Для хорошей цитаты. – Mahesh

+0

+2 для подробного объяснения – Ernie

+0

В этом вопросе (который, безусловно, является дубликатом), я думаю, что интересно объяснить, что ** используется ** означает в контексте §9.4.2/4, поскольку оно не является интуитивным, и почему в противном случае определение не требуется. Первая часть как-то указана в *, потому что вы не принимаете адрес *, но я не уверен, что большинство людей поймут, что это приближение термина * used *. –

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