LINUX.ORG.RU

[C++] static const и хороший тон.

 


0

1

Вопросы такие.

У меня в классе есть некоторое поле, которое не меняет своего значения от экземпляра к экземпляру. Оно используется в нескольких методах. Тут использовать static const доктор прописал?

А если оно используется только в одном методе, то тут тоже надо использовать static const, но уже делать объявление внутри метода?

Раньше использовал просто const-поля.

★★★★★

> Тут использовать static const доктор прописал?

Если значение известно на этапе компиляции, то да

А если оно используется только в одном методе, то тут тоже надо использовать static const, но уже делать объявление внутри метода?

Если надо (а надо?) хранить состояние между вызовами, то да

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Насчет второго пункта - о каком хранении состояния может идти речь, когда это константа. Насчет первого ясно, так и думал.

Obey-Kun ★★★★★
() автор топика

> А если оно используется только в одном методе, то тут тоже надо использовать static const, но уже делать объявление внутри метода?

Область видимости должна быть минимально-необходимой, поэтому в данном случае надо делать объявление внутри метода. Делать его static или нет зависит от типа поля (например, не стоит добавлять static к const int).

anonymous
()
Ответ на: комментарий от yoghurt

У студентов во время сессии такая каша в голове! static добавляют к локальным константам чтобы инициализация выполнялась только 1 раз за время работы программы, а не для того чтобы состояние между вызовами хранить.

anonymous
()
Ответ на: комментарий от anonymous

я забыл о константах из оригинального поста :)

yoghurt ★★★★★
()
Ответ на: комментарий от Obey-Kun

> А почему не стоит добавлять static к const int?

«Static locals in global functions can be thought of as global variables, because their value remains in memory for the life of the program. The only difference is that they are only accessible (i.e., scoped) to one function.»

ну и добавится проверка на инициализацию этой переменной, но то мелочь

aho
()
Ответ на: комментарий от Obey-Kun

> Где там про целые-то

действительно, я и забыл, что значения «целых» волшебным образом умеют сохраняться сами собой

aho
()

Срамота, такие вопросы задавать. а еще и звезданутый. Читай страуструпа.

anonymous
()
Ответ на: комментарий от aho

Блин, я все равно не понял... Почему из твоего текста следует то, что не надо использовать static const T в методах?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

И да, разве проверка на инициализацию будет пускаться в случае константы?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Следует или нет зависит от задачи

Второй смысл ключевого слова static несколько иной. При применении к ло­кальной переменной, определенной в функции или блоке (не забывайте, что по умолчанию эти переменные автоматические), данное ключевое слово перемещает переменную из стека в фиксированную область памяти. Там переменная будет существовать не от начала до конца функции или блока (как автоматические пере­менные), а от начала программы до конца ее выполнения, т. е. значение в данной области памяти присваивается при первом входе в область действия и будет доступно при повторном входе в нее. Что касается имени переменной, то к нему все равно применимы правила области действия, о которых рассказывалось выше. Имя неизвестно вне фигурных скобок — блока, где она определена. Следовательно, другие независимые области действия (даже в том же файле) могут использовать это имя для своих целей. Более того, несколько переменных в разных областях действия могут определяться как static и носить одно и то же имя. Это не приве­дет к конфликту имен, хотя память для переменных отводится в фиксированной области. Поскольку они находятся в разных областях действия, эти имена извест­ны в разные моменты выполнения программы.

Genuine ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.