Что означает "const" в конце объявления функции?

Мне попалась книга, где написано что-то вроде:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

Что это значит?

Комментарии к вопросу (7)
Решение

Функция "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 this: int Foo_Bar(const Foo* this, int random_arg). Поскольку тип this в этом случае const, никакие модификации переменных-членов невозможны.

Можно ослабить ограничение "const-функции", не позволяющее функции записывать в любую переменную класса. Чтобы позволить некоторым переменным быть доступными для записи, даже когда функция помечена как "const-функция", эти переменные класса помечаются ключевым словом mutable. Таким образом, если переменная класса помечена как mutable, а функция "const function" записывает в эту переменную, то код будет компилироваться чисто, и переменную можно будет изменить. (C++11)

Как обычно при работе с ключевым словом const, изменение местоположения ключевого слова const в выражении C++ имеет совершенно другое значение. Приведенное выше использование const применимо только при добавлении const в конец объявления функции после круглой скобки.

const - очень часто используемый классификатор в C++: синтаксис и упорядочивание в сочетании с указателями часто не являются простыми. Некоторые материалы о корректности const и ключевом слове const:

Корректность Const

The C++ 'const' Declaration: Why & How

Комментарии (6)

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

class Boo { ... };

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

Теперь вы можете называть любой функции-члена Бу на В0, но только как const-квалифицированный функций-членов на уровне B1.

Комментарии (0)

Гарантируется, что ``Bar'' не изменит объект, на котором он вызывается. Смотрите, например, раздел о const-корректности в C++ FAQ.

Комментарии (1)

Аналогично этому вопросу.

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

Комментарии (0)

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

Комментарии (1)

Функция может't изменить его параметры через указатель/ссылку ты дал ему.

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

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

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

Комментарии (0)