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

Возможный дубликат:
Значение "const" последний в объявлении метода C++?

Я получил книгу, где там написано что-то вроде:

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

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

6 ответов

Решение

"Const function", обозначаемая ключевым словом const после объявления функции делает это ошибкой компилятора для этой функции класса, чтобы изменить переменную-член класса. Тем не менее, чтение переменных класса хорошо внутри функции, но запись внутри этой функции вызовет ошибку компилятора.

Другой способ думать о такой "константной функции" - рассматривать функцию класса как нормальную функцию, принимающую неявную this указатель. Так что метод int Foo::Bar(int random_arg) (без константы в конце) приводит к такой функции, как 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) тогда можно понимать как объявление с константой этого указателя: 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++ "const" декларация: почему и как

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

class Boo { ... };

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

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

Bar гарантированно не изменяет объект, на который он вызывается. См. Раздел о правильности констант в C++ FAQ, например.

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

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

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

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

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

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

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

Другие вопросы по тегам