Вот некоторый код, скопированный с Размышления в C++ Глава 10 Vol1.
#include <iostream>
using namespace std;
int x = 100;
class WithStatic {
static int x;
static int y;
public:
void print() const {
cout << "WithStatic::x = " << x << endl;
cout << "WithStatic::y = " << y << endl;
}
};
каково значение константы для функциональной печати ()?Спасибо!
Я слышал, что это описывалось ранее как «метод, который логически не изменяет объект». Это означает, что, вызывая этот метод, вызывающий может ожидать, что состояние объекта останется прежним после возврата из метода. Фактически, указатель this
становится постоянным указателем на постоянный экземпляр этого класса, поэтому переменные-члены не могут быть изменены. Исключением из этого правила являются переменные-члены, объявленные с mutable
. Если в классе есть изменяемые
переменные-члены, они могут быть изменены как неконстантными, так и константными методами. Кроме того, неконстантные методы нельзя вызывать из константных методов.
Некоторые люди используют изменяемые
переменные-члены для кэширования результатов своевременных вычислений. Теоретически состояние объекта не меняется (т.е. единственный эффект заключается в том, что последующие вызовы выполняются быстрее, но дают те же результаты при том же вводе).
Это означает, что он не изменяет никакие переменные-члены класса.
http://www.parashift.com/c++-faq-lite/const-correctness.html
Это гарантия, что функция вообще не будет изменять объект (т.е. это функция «только для чтения»). РЕДАКТИРОВАТЬ: По-видимому, исключение из этого правила - если объект имеет изменяемые
члены; они могут быть изменены как константными, так и неконстантными функциями.
Также я рад видеть, что кто-то еще учится у TIC ++. Это отличный ресурс для новичков.
Он фактически делает указатель this
константным указателем на константу вместо константного указателя на неконстантное. Итак, всякий раз, когда вы ссылаетесь на this
в константной функции-члене - явно или неявно - вы используете константный указатель на const.
Итак, в случае класса, который у вас здесь, в любой неконстантной функции тип this
равен WithStatic const *
, а в константных функциях его тип равно const WithStatic * const
.
Как и с любым указателем на const, вы не можете изменить ничего, на что он указывает. Таким образом, вы не можете изменить ни одну из его переменных-членов, и вы не можете вызывать какие-либо из его неконстантных функций-членов.
Вообще говоря, это хорошая идея сделать функцию-член константой, если у вас есть разумные основания сделать это, потому что это гарантирует, что вы не собираетесь изменять состояние объекта, и вы можете вызывать его с помощью объекта const.
переменные-члены могут быть изменены, если они изменяемые
или изменчивые
, но это более сложные темы, которых, вероятно, лучше избегать, пока вы лучше знакомы с языком. Конечно, обычно вам не нужно о них беспокоиться и не следует использовать их, если в этом нет необходимости. Также можно отказаться от постоянства указателя this
, после чего вы можете изменить его, но IIRC, это неопределенное поведение, и это определенно считается плохой идеей.Итак, есть случаи, когда можно изменить состояние объекта в константной функции-члене, но обычно это невозможно, и лучше избегать, даже если это так.
Когда вы делаете функцию-член константой, вы фактически обещаете, что состояние объекта не будет изменено этим вызовом функции (хотя, очевидно, могут быть побочные эффекты, о чем свидетельствует тот факт, что вы можете вызывать такие функции, как printf ()
).
константа означает, что print () не может изменять переменные состояния, не отмеченные как изменяемые.
Если функция-член объявлена как «const», это означает, что функция не будет изменять состояние объекта. Это:
По всем вышеперечисленным причинам следует, как общее практическое правило, объявлять функцию как «константную», если он не изменяет логически состояние объекта. Если логическое состояние объекта меняется, не используйте "const". Кроме того, бывают случаи, когда фактическое состояние изменяется, а логическое - нет (например, кеширование), и в этом случае следует все же пометить функцию как «const», но нужно использовать ключевое слово «mutable» с кешированием. переменные, чтобы сообщить компилятору, что их изменение на самом деле не меняет логического состояния.