2017-01-31 21 views
4

Почему я могу написать это:Зачем мне здесь статичный?

class VoiceManager 
{ 
public: 
    static const int mMaxNumOfVoices = 16; 
    Voice mVoices[mMaxNumOfVoices]; 

private: 
}; 

, но я не могу использовать это:

class VoiceManager 
{ 
public: 
    const int mMaxNumOfVoices = 16; 
    Voice mVoices[mMaxNumOfVoices]; 

private: 
}; 

Он говорит: «нестатический контрольный элемент должен быть по отношению к конкретному объекту»

Но в обоих случаях mMaxNumOfVoices является const и будет инициализирован до mVoices init (компилятор должен следовать порядку декларации, нет?).

Для этого требуется static. Зачем?

+0

Контекст и сообщение об ошибке, пожалуйста. – LogicStuff

+0

Возможно, потому, что он не знал бы до времени выполнения, что такое 'mMaxNumOfVoices'? И использование 'static' заставляет это значение быть известным. –

+2

Я думаю, что только 'const' не делает его постоянной времени компиляции, тогда как' static const' does – torkleyy

ответ

16

Границы массива должны быть известны во время компиляции. Хотя ваша инициализация написана там в коде, она может быть переопределена во время выполнения конструктором. Следовательно, ваша переменная-член не static не является константой времени компиляции.

+0

"он может быть переопределен во время выполнения конструктором" uhm, no! Это const. Он не может быть переопределен (или, по крайней мере, не должен). – markzzz

+8

@paizza - [Да, может) (http://ideone.com/kcdFBe). Нестатическая переменная-член всегда может иметь свое значение, установленное в конструкторе, даже если оно снабжено инициализатором по умолчанию. – StoryTeller

+1

или с использованием более старого [синтаксиса инициализатора конструктора] (http://ideone.com/rsVBdY). –

1

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

А гарантия static const не ограничена для остальной части программы. Хранилище для объекта выделяется, когда программа начинается и освобождается, когда программа заканчивается. Существует только один экземпляр объекта. Все объекты, объявленные в области пространства имен (включая глобальное пространство имен), имеют такую ​​продолжительность хранения.

+0

Это использование 'const' также гарантирует, что переменная останется неизменной на всю жизнь; случай с указателем на константу не применяется к этому коду. Кроме того, static consts может вообще не иметь никакого хранилища, если они не используются odr; но любой статический объект, который имеет хранилище, может задержать его инициализацию до первого использования и может не быть постоянным выражением. Этот код (не в классе) показывает, что ваше объяснение неверно: 'static const int x = foo(); int y [x]; '- ошибка –

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

  • Нет связанных вопросов^_^