Возможный дубликат:
Значение "const" в объявлении метода С++?
Привет У меня есть книга, где написано что-то вроде:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
Кроме того, вопрос о том, почему я должен/не должен использовать const
перед объявлениями аргументов? Что это изменит?
int Foo (const int Bar) { /* code */ }
EDIT: Поэтому, если я сейчас сделаю:
Foo v1, v2;
Будет ли функция (const-tagged) Bar существовать 3 раза или 1 раз в памяти?
"Функция const", обозначаемая ключевым словом const
после объявления функции, превращает эту ошибку класса в функцию компилятора, чтобы изменить переменную-член класса. Тем не менее, чтение переменных класса нормально внутри функции, но запись внутри этой функции вызовет ошибку компилятора.
Другой способ думать о такой "константной функции" состоит в том, чтобы рассматривать функцию класса как нормальную функцию, принимающую неявный указатель this
. Таким образом, метод int Foo::Bar(int random_arg)
(без const в конце) приводит к такой функции, как int Foo_Bar(Foo* this, int random_arg)
, и к вызову, например Foo f; f.Bar(4)
Foo f; f.Bar(4)
будет внутренне соответствовать чему-то вроде Foo f; Foo_Bar(&f, 4)
Foo f; Foo_Bar(&f, 4)
. Теперь добавление const в конце (int Foo::Bar(int random_arg) const
) можно тогда понимать как объявление с указателем const this: int Foo_Bar(const Foo* this, int random_arg)
. Поскольку тип this
в таком случае является const, никакие модификации переменных-членов невозможны.
Можно ослабить ограничение "const function", запрещающее функции писать любую переменную класса. Чтобы позволить некоторым переменным быть доступными для записи, даже если функция помечена как "константная функция", эти переменные класса помечаются ключевым словом mutable
. Таким образом, если переменная класса помечена как изменяемая, и "константная функция" записывает в эту переменную, тогда код будет скомпилирован правильно, и переменную можно будет изменить. (C++ 11)
Как обычно при работе с ключевым словом const
, изменение местоположения ключевого слова const в выражении C++ имеет совершенно разные значения. Вышеупомянутое использование const
применяется только при добавлении const
в конец объявления функции после круглых скобок.
const
- это преувеличенный префикс в C++: синтаксис и порядок часто не так просты в сочетании с указателями. Некоторые показания о const
корректности и const
ключевое слово:
Рассмотрим две переменные типа:
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
Теперь вы можете вызвать любую функцию-член Boo
на b0
, но только const
-qualified функции-члены на b1
.
Bar
гарантированно не изменять объект, на который он вызывается. Например, в разделе о константной корректности в FAQ по С++.
mutable
ключевое слово.
Похоже на этот вопрос.
По сути это означает, что метод Bar
не будет изменять не являющиеся изменяемые переменные - член Foo
.
Функция не может изменять свои параметры с помощью указателя/ссылки, которую вы ему дали.
Я перехожу на эту страницу каждый раз, когда мне нужно подумать об этом:
http://www.parashift.com/c++-faq-lite/const-correctness.html
Я считаю, что там также хорошая глава в Meyers "Более эффективный С++".
Мне всегда кажется, что концептуально легче думать, что вы создаете этот указатель const (что в значительной степени то, что он делает).
this
является const
, а на что он указывает, т.е. *this
;)
this
сFoo* const
наconst Foo* const
. Это имеет последствия.