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

Это потому, что статические методы не являются полиморфными. Более того, статический метод должен вызываться не объектом, а использованием класса, то есть Main.method() или SubMain.method(). Когда вы вызываете m.method(), java фактически вызывает Main.method(), потому что m имеет тип Main.

Если вы хотите использовать полиморфизм, не используйте статические методы.

482
задан Mark Amery 14 January 2019 в 20:02
поделиться

6 ответов

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

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

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

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

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

Объявление 'const' C ++: Почему и как

829
ответ дан 22 November 2019 в 22:38
поделиться

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

class Boo { ... };

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

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

44
ответ дан 22 November 2019 в 22:38
поделиться

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

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

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

Я считаю, что есть еще и хороший глава в книге Мейерса «Более эффективный C ++».

8
ответ дан 22 November 2019 в 22:38
поделиться

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

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

8
ответ дан 22 November 2019 в 22:38
поделиться

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

12
ответ дан 22 November 2019 в 22:38
поделиться

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

8
ответ дан 22 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: