С++ 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 для типа возврата или для подписи метода. В первом случае возвращаемое значение будет постоянным. Во втором случае метод будет так называемым постоянным методом, который не может изменить представление объекта. В постоянных объектах можно использовать только константные методы.