С++ const в getter
Я все еще изучаю С++, и я читаю везде, что я должен использовать const
везде, где могу (по причине скорости, я думаю).
Обычно я пишу свой метод getter следующим образом:
const bool isReady() {
return ready;
}
Но я видел, что некоторый автогенератор IDE таким образом:
bool getReady() const {
return ready;
}
Но, написав делегатов, мне случилось найти эту ошибку, если const
после функции:
member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const
Итак, что лучший способ написать const getter? Мне действительно нужно заботиться?
Ответы
Ответ 1
Существует огромное различие между двумя способами.
const bool isReady()
В приведенном выше коде будет возвращен const bool
, но он не гарантирует, что объект не изменит свое логическое состояние.
bool isReady() const
Это вернет a bool
, и это гарантирует, что логическое состояние вашего объекта не изменится. В этом случае нет необходимости писать const
перед типом возврата. Нет смысла возвращать const bool
, потому что это копия. Поэтому сделать это const
бесполезно. Второй const
необходим для const
correctness, который не используется по соображениям скорости, но делает вашу программу более надежной и безопасной.
Ответ 2
Они означают две разные вещи:
const bool isReady() {
return ready;
}
Возвращает константу bool. Значение bool, которое не может изменить значение с момента его создания.
bool getReady() const {
return ready;
}
Это постоянная функция, означающая функцию, которая не будет изменять какие-либо переменные-члены класса, к которому он принадлежит. Этот стиль рекомендуется использовать для геттеров, поскольку их единственная цель - извлечь данные и не должна ничего изменять в процессе.
Ответ 3
const
метод сообщает компилятору, что вы не будете модифицировать экземпляр класса, на который вызывается этот метод:
class A {
public:
bool getReady() const {
return ready;
}
};
поэтому, если вы попытаетесь изменить свой объект внутри getReady(), тогда компилятор выдаст ошибку. Методы Const полезны там, где у вас есть: const A &, или const A *, тогда вы можете вызывать только такие методы const для таких объектов.
для:
const bool isReady() {
return ready;
}
этот const не дает реальной выгоды, поскольку bool копируется, а isReady() возвращается. Такой const
имеет смысл, если возвращаемый тип был const char*
или const A&
, в таких случаях const
делает ваш экземпляр char или экземпляр класса A неизменным.
Ответ 4
A const getter имеет подпись
bool getReady() const
Другая версия не является методом const
, она просто возвращает значение const
(что в принципе бесполезно).
Наличие const
getter позволяет вызывать его на объектах const:
const Object obj;
obj.getReady();
Это допустимо только в том случае, если getReady
отмечен как const
.
Ответ 5
Существует разница между использованием ключевого слова const
для типа возврата или для подписи метода. В первом случае возвращаемое значение будет постоянным. Во втором случае метод будет так называемым постоянным методом, который не может изменить представление объекта. В постоянных объектах можно использовать только константные методы.