Что означает "const" в конце объявления функции?
Заголовок: Что означает 'const' в конце объявления метода класса?
Я читаю книгу, в которой говорится о следующем:
class Foo
{
public:
int Bar(int random_arg) const
{
// код
}
};
Мне не совсем понятно, что означает использование ключевого слова 'const' в конце объявления метода Bar
.
Можете объяснить, как это влияет на работу метода и что это означает с точки зрения языка C++? Также был бы признателен за любые ссылки на дополнительные ресурсы, которые могут прояснить этот вопрос.
Заранее спасибо!
3 ответ(ов)
Когда вы работаете с двумя переменными типа класса, как в вашем примере, у вас есть различия в том, какие функции-члены класса вы можете вызывать на этих объектах.
class Boo { ... };
Boo b0; // изменяемый объект
const Boo b1; // неизменяемый объект
В случае с b0
, так как это обычный (изменяемый) объект, вы можете вызывать любыe функции-члены класса Boo
, включая как изменяющие, так и неизменяющие функции. Это позволяет вам изменять состояние объекта b0
.
Однако для b1
, который является const
-объектом, вы можете вызывать только функции-члены, которые объявлены как const
. Это ограничение гарантирует, что состояние объекта не будет изменено. Если вы попытаетесь вызвать изменяющую функцию на b1
, компилятор выдаст ошибку.
Таким образом, ваше использование const
для объекта b1
играет ключевую роль в обеспечении неизменности и целостности данных.
Я всегда нахожу концептуально проще думать о том, что вы делаете указатель this константным (что, по сути, он и делает).
Функция не может изменить свои параметры через указатель/ссылку, который вы ей передали.
Я рекомендую посетить следующую страницу, когда вам нужно об этом задуматься:
http://www.parashift.com/c++-faq-lite/const-correctness.html
Также я считаю, что в книге "Более эффективный C++" автора Скотта Мейерса есть хорошая глава на эту тему.
Разница между const int*, const int * const и int * const?
В чем разница между constexpr и const?
Что означает 'const' в конце объявления метода класса?
Что такое Правило трёх?
Имеют ли круглые скобки после имени типа значение при использовании new?