Например, у меня есть следующий код.
#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
функция объекта.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте! Не могу найти ошибку в программе, на моем компьютере все нормально работает, на сервере - нетПоможете?
Есть 3 буфера
Цель такая: если запись с таким id есть, тогда делаем инкремент значения в столбце count этой строки, а если же нет, то создаём новую запись (у столбца...