член const не инициализируется явно, но компилируется - PullRequest
2 голосов
/ 30 июля 2010

Я слышал, что члены const должны быть явно инициализированы, но следующие компиляции для меня:

class someClass
{
    int const x;
};

int main()
{
    return 0;
}

Ответы [ 2 ]

6 голосов
/ 30 июля 2010

Если у класса есть константные переменные-члены, то для любого конструктора, определенного для этого класса, эти переменные должны быть инициализированы в списке инициализатора конструктора. Если какой-либо определенный конструктор не инициализирует переменную-член с квалификацией const, программа некорректна.

В вашем примере кода someClass не имеет объявленных пользователем конструкторов, поэтому существует неявно объявленный конструктор по умолчанию. Однако, если этот конструктор не используется, он не определяется. Поскольку вы не создаете экземпляр объекта someClass, конструктор не используется. Следовательно, ваш пример кода не содержит ошибок.

Если вы должны определить конструктор для класса и не инициализировать член const,

class someClass
{
    someClass() { } // error, does not initialize const-qualified x
    int const x;
};

или если вы создадите экземпляр экземпляра someClass (что приведет к определению неявно объявленного конструктора по умолчанию), то программа будет некорректно сформирована.

4 голосов
/ 30 июля 2010

Попробуйте это:

int main()
{
    someClass obj;
    return 0;
}

Поскольку вы не создали экземпляр своего объекта, ваш компилятор не выдал ошибку. Вы, наверное, знаете правильный способ инициализации x, но я опускаю его на всякий случай.

class someClass
{
    int const  x;
public:
    someClass():x(10){}
};
...