определение статического конста вне определения класса - PullRequest
6 голосов
/ 24 мая 2011

Должны ли мы определить 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. Поэтому я хочу спросить, почему обе версии работают и какая из них соответствует стандарту?

1 Ответ

8 голосов
/ 24 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...