Сегодня возникла проблема. Мне нужна static
функция-член, const
это не обязательно, но лучше. Но мои усилия не увенчались успехом. Кто-нибудь может сказать, почему и как?
c++
static
language-lawyer
const-method
прабхакаран
источник
источник
const
для вас означает статическая функция-член?Ответы:
Когда вы применяете
const
квалификатор к нестатической функции-члену, он влияет наthis
указатель. Для константного квалифицированных функции члена классаC
, тоthis
указатель типаC const*
, в то время как для функции члена , который не Const квалификации, тоthis
указатель типаC*
.Статическая функция-член не имеет
this
указателя (такая функция не вызывается в конкретном экземпляре класса), поэтому квалификация const статической функции-члена не имеет никакого смысла.источник
const
для статического члена должно быть таким же, как и для нестатического. В качестве примера того, что такое мышление не работает, рассмотрим значениеstatic
, которое зависит от контекста.C const*
илиconst C*
?Я согласен с вашим вопросом, но, к сожалению, C ++ так устроен. Например:
class A { int i; //<--- accessed with 'this' static int s; //<---- accessed without 'this' public: static void foo () const // <-- imaginary const {} };
На сегодняшний день
const
рассматривается в контекстеthis
. В каком-то смысле узкий. Его можно расширить, применив этот указательconst
за пределамиthis
.то есть «предложенный»
const
, который также может применяться кstatic
функциям, ограничиваетstatic
членов от любых изменений.В примере кода, если
foo()
это можно сделатьconst
, то в этой функцииA::s
изменить нельзя. Я не вижу никаких языковых побочных эффектов, если это правило добавлено к стандарту. Наоборот, забавно, почему такого правила не существует!источник
const
применяется к объекту (в случае константных функций-членов - к экземпляру, для которого он вызван). Вы хотите, чтобы это применялось ко всем статическим членам класса, я бы предположил, что если бы он вообще рассматривался комитетом, то это не считалось достаточно общим требованием для поддержки.const
Модификатор не применяется к методам членов или переменным членов, но с неявнымthis
-указателем. Поскольку статический метод-член не привязан к объекту,this
для создания указателя не требуетсяconst
.Не вдаваясь в подробности, это потому, что объект может быть изменен функцией, а может и не быть, поэтому const неоднозначна для компилятора.
Напомним, что
const
объекты остаются постоянными, но здесь может быть или не быть объекта, который нужно поддерживать.источник
this
указателя. (Кроме того,const
не сохраняет объекты постоянными. Это предотвращает использование определенного указателя или ссылки для изменения объекта, но модификация все равно может происходить по другому пути)К сожалению, C ++ не принимает это в соответствии с дизайном, но логически существует несколько вариантов использования, в которых он хорошо проверяется.
Функция, которая является допустимой (статической) на уровне класса, может не изменять никаких статических данных, возможно, она просто запросит данные, которые должны быть константными. Может быть так должно быть
if(Object) MakeThisConstant() else MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
источник
«Константной функции-члену» не разрешается изменять объект, для которого она вызывается, но статические функции-члены не вызываются ни для одного объекта. Он используется непосредственно оператором разрешения области видимости. Таким образом, наличие статической функции-члена const не имеет смысла, следовательно, это незаконно.
источник