Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

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

#cpp #классы #функции #const


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

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


Ответы

Ответ 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;} поскольку они никак не меняют состояние объекта.

Ответ 2



Нестатическая функция-член, помимо явно указанных в круглых скобках параметров, принимает еще и неявный указатель this. Т.е. указатель на экземпляр объекта, на котором эта функция была вызвана. Если const после списка параметров не указан this имеет тип X* const, т.е. указатель, который нельзя поменять, но сам объект изменять можно через этот указатель. А вот когда const присутствует, тип this становится const X* const, т.е. добавляется запрет на попытки изменить объект через этот указатель. Наличие const для конкретного параметра функции говорит о том, что нельзя изменять именно этот параметр. Для других параметров будут действовать их собственные ограничения. В общем случае, добавление const там, где объект не предполагается изменять позволяет писать более надёжный и понятный код, т.е. нельзя случайно изменить объект, который по логике разработчика меняться не должен. При попытке изменить такой объект, компилятор выдаст ошибку. По теме const можно напомнить ещё о существовании ключевого слова mutable, наличие которого у члена объекта позволяет менять этот член даже если была вызвана const функция объекта.

Комментариев нет:

Отправить комментарий