Сегодня возникла проблема. Мне нужна static
функция-член, const
это не обязательно, но лучше. Но мои усилия не увенчались успехом. Кто-нибудь может сказать, почему и как?
Сегодня возникла проблема. Мне нужна static
функция-член, 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 не имеет смысла, следовательно, это незаконно.
const
для вас означает статическая функция-член?