#cpp #классы #функции #const
Например, у меня есть следующий код. #includeusing 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 функция объекта.
Комментариев нет:
Отправить комментарий