Что означает «const» в конце объявления функции? [Дубликат]

456

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

  • 2
    Дубликат stackoverflow.com/questions/751681/…
  • 7
    Это меняет тип this с Foo* const на const Foo* const . Это имеет последствия.
Показать ещё 5 комментариев
Теги:
const

6 ответов

786
Лучший ответ

"Функция 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++ "постоянная" декларация: почему и как

  • 5
    @ereOn, если вам понравился изменчивый, вам может понравиться это. Наиболее распространенный вариант использования «изменяемого» - это модификатор мьютекса, управляющий доступом к экземпляру класса. То, что вы обещаете не изменять экземпляр, не означает, что то, что вы читаете из него, не будет изменено кем-то другим, имеющим неконстантную ссылку на него.
  • 3
    @ Дженик, я изучал c ++ один-два года, никогда не видел, чтобы в каких-либо книгах содержалось такое объяснение, и я чувствую, что это действительно полезно. Какие типы книг я должен читать, чтобы изучить такие вещи, как этот, неявно этот указатель.
Показать ещё 3 комментария
34

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

class Boo { ... };

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

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

11

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

  • 10
    Не забудьте про mutable ключевое слово.
8

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

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

7

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

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

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

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

7

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

  • 4
    На самом деле не сам указатель this является const , а на что он указывает, т.е. *this ;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню