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