Например, у меня есть следующий код.
#include <iostream>
using namespace std;
class X {
int x;
public:
X(int i = 2): x {i} {}
void print() const {cout << x;}
// ^^^^^
int getx() const {return x;}
// ^^^^^
X operator-(const X& rop) {return x + 2*rop.x;}
// ^^^^^
int operator-(int rop) {return 2*x + rop;}
};
int operator-(int lop, const X& rop) {
// ^^^^^
return lop – rop.getx();
}
int main() {
X x {6},y;
cout << x – 3 – y;
return 0;
}
Подскажите, пожалуйста, каково назначение ключевого слова const в сигнатуре функций?
Чтобы этот код мог работать с константными объектами. Это const означает, что вызов метода print() не изменит состояния объекта.
void print() const {cout << x;}
int getx() const {return x;}
Здесь вы никак не меняете объект класса - поэтому нет никакого смысла делать НЕ const (мое мнение - лучше делать все, что только можно, с const, применяя его по умолчанию, и не использовать его только там, где это необходимо), зато эти методы можно будет вызвать, например, при передаче объекта в качестве константного параметра - вот как тут:
X operator-(const X& rop) {return x + 2*rop.x;}
Вы же никак не меняете rop, так что можете теперь вызывать оператор для любого объекта, в том числе временного.
Кстати, операторы я бы тоже делал константными, типа
X operator-(const X& rop) const {return x + 2*rop.x;}
поскольку они никак не меняют состояние объекта.
Нестатическая функция-член, помимо явно указанных в круглых скобках параметров, принимает еще и неявный указатель this. Т.е. указатель на экземпляр объекта, на котором эта функция была вызвана.
Если const после списка параметров не указан this имеет тип X* const, т.е. указатель, который нельзя поменять, но сам объект изменять можно через этот указатель.
А вот когда const присутствует, тип this становится const X* const, т.е. добавляется запрет на попытки изменить объект через этот указатель.
Наличие const для конкретного параметра функции говорит о том, что нельзя изменять именно этот параметр. Для других параметров будут действовать их собственные ограничения.
В общем случае, добавление const там, где объект не предполагается изменять позволяет писать более надёжный и понятный код, т.е. нельзя случайно изменить объект, который по логике разработчика меняться не должен. При попытке изменить такой объект, компилятор выдаст ошибку.
По теме const можно напомнить ещё о существовании ключевого слова mutable, наличие которого у члена объекта позволяет менять этот член даже если была вызвана const функция объекта.
Продвижение своими сайтами как стратегия роста и независимости