Сегодня возникла проблема. Мне нужна 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для вас означает статическая функция-член?