дублировать тот же метод с const? - PullRequest
1 голос
/ 09 марта 2011

В C ++ я вижу этот код.

public: 
    Ports& GetPorts();
    const Ports& GetPorts() const;

Почему нужен другой метод с const? Как компилятор может решить, какой метод вызывать?

Ответы [ 3 ]

6 голосов
/ 09 марта 2011

Если вы вызываете x.GetPorts() и x не является const объектом, будет вызвана первая версия.Если x является const объектом, с другой стороны, будет вызвана вторая версия.Этот тип кода говорит: «Если объект является изменяемым, разрешите изменение результата GetPorts(); если объект const, не допускайте изменения результата»Компилятор предпочтет первую версию, если она совпадает;однако, он не будет представлен, если объект const, и поэтому вместо него будет использоваться вторая версия.

3 голосов
/ 09 марта 2011

Поскольку первая перегрузка не является методом const, его нельзя вызывать для временных объектов и объектов const.Если вы предоставляете const-перегрузку, вы по существу поддерживаете const-объекты.

Компилятор будет использовать const-перегрузку для const-объектов и неконстантную перегрузку для неконстантных объектов.

Обычно это ненеобходимо обеспечить перегрузку, если ваша функция является константной, потому что константные функции настолько безопасны, насколько это возможно: они работают как с константными объектами, так и с неконстантными объектами.

1 голос
/ 09 марта 2011

Это необходимо, только если вы хотите иметь разное поведение для постоянных и неконстантных объектов. В противном случае второй версии достаточно. Дизайнерское решение.

...