Что означает "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 ключевые слова:

Const правильность

объявление c++ 'const': почему & как


рассмотрим две переменные класса:

class Boo { ... };

Boo b0;       // mutable object
const Boo b1; // non-mutable object

теперь вы можете позвонить любой функции-члена Boo on b0, но только const-квалифицированные функции-члены на b1.


Bar гарантированно не изменяет объект, на который он вызывается. Вижу раздел о корректности const В C++ FAQ, например.


аналогично этой вопрос.

по сути это означает, что метод Bar не будет изменять non mutable переменные-члены Foo.


Мне всегда концептуально легче думать о том, что вы делаете этот указатель const (что в значительной степени то, что он делает).


функция не может изменить свои параметры с помощью указателя / ссылки, которую вы ей дали.

захожу на эту страницу каждый раз, когда мне нужно думать об этом:

http://www.parashift.com/c++-faq-lite/const-correctness.html

Я считаю, что есть также хорошая глава в "более эффективном C++" Мейерса.