Какая польза от перегрузки const в C ++? - PullRequest
53 голосов
/ 30 октября 2008

В C ++ сигнатура функции частично зависит от того, является ли она константной. Это означает, что класс может иметь две функции-члена с одинаковыми сигнатурами, за исключением того, что одна является const, а другая - нет. Если у вас есть такой класс, то компилятор решит, какую функцию вызывать, основываясь на объекте, для которого вы его вызываете: если это экземпляр класса const, будет вызвана версия const функции; если объект не является константой, будет вызвана другая версия.

При каких обстоятельствах вы можете воспользоваться этой функцией?

Ответы [ 4 ]

25 голосов
/ 30 октября 2008

Это действительно имеет смысл, только когда функция-член возвращает указатель или ссылку на член данных вашего класса (или член члена, или член члена члена, ... и т. Д.). Обычно возвращаются неконстантные указатели или ссылки на элементы данных, но иногда это разумно или просто очень удобно (например, оператор []). В таких случаях вы предоставляете постоянную и неконстантную версии геттера. Таким образом, решение о том, может ли объект быть изменен, принимается функцией, использующей его, которая может объявить его постоянным или неконстантным.

24 голосов
/ 30 октября 2008

Это так, что вы можете заставить компилятор принудительно использовать, возвращаете ли вы объект const или обычный объект, и при этом поддерживать ту же сигнатуру метода. Есть подробное объяснение на Const Correctness .

5 голосов
/ 31 октября 2008

Посмотрите на поведение std :: map :: operator []. Константная версия выдает ошибку, если вы пытаетесь сослаться на неверный ключ, но неконстантная версия выполняет вставку. Поведение вставки намного удобнее, чем использование std :: map :: insert (и, кроме того, будет выполнять перезапись), но не может работать для карты констант.

5 голосов
/ 30 октября 2008

Возможно, вы захотите использовать его, чтобы решить, возвращать или нет постоянную ссылку на объект или нет. Контейнеры STL используют перегруженные const функции begin () и end (), чтобы решить, возвращать ли const_iterator или обычный итератор.

...