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

Возможный дубликат:
Значение "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 раз в памяти?

Ответ 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 ключевое слово:

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

C++ "постоянная" декларация: почему и как

Ответ 2

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

class Boo { ... };

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

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

Ответ 4

Похоже на этот вопрос.

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

Ответ 5

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

Ответ 6

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

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

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

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