Зачем нужен const в сигнатуре функции?

549
31 декабря 2016, 15:16

Например, у меня есть следующий код.

#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 в сигнатуре функций?

Answer 1

Чтобы этот код мог работать с константными объектами. Это 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;} 

поскольку они никак не меняют состояние объекта.

Answer 2

Нестатическая функция-член, помимо явно указанных в круглых скобках параметров, принимает еще и неявный указатель this. Т.е. указатель на экземпляр объекта, на котором эта функция была вызвана.

Если const после списка параметров не указан this имеет тип X* const, т.е. указатель, который нельзя поменять, но сам объект изменять можно через этот указатель.

А вот когда const присутствует, тип this становится const X* const, т.е. добавляется запрет на попытки изменить объект через этот указатель.

Наличие const для конкретного параметра функции говорит о том, что нельзя изменять именно этот параметр. Для других параметров будут действовать их собственные ограничения.

В общем случае, добавление const там, где объект не предполагается изменять позволяет писать более надёжный и понятный код, т.е. нельзя случайно изменить объект, который по логике разработчика меняться не должен. При попытке изменить такой объект, компилятор выдаст ошибку.

По теме const можно напомнить ещё о существовании ключевого слова mutable, наличие которого у члена объекта позволяет менять этот член даже если была вызвана const функция объекта.

READ ALSO
Ошибка с памятью [требует правки]

Ошибка с памятью [требует правки]

Здравствуйте! Не могу найти ошибку в программе, на моем компьютере все нормально работает, на сервере - нетПоможете?

350
Как сделать UPDATE, а при отсутствии записи - INSERT?

Как сделать UPDATE, а при отсутствии записи - INSERT?

Цель такая: если запись с таким id есть, тогда делаем инкремент значения в столбце count этой строки, а если же нет, то создаём новую запись (у столбца...

464