Возврат константной ссылки на объект вместо копии - PullRequest
69 голосов
/ 25 сентября 2008

Во время рефакторинга некоторого кода я наткнулся на некоторые методы получения, которые возвращают std :: string. Примерно так, например:

class foo
{
private:
    std::string name_;
public:
    std::string name()
    {
        return name_;
    }
};

Конечно, получателю лучше вернуть const std::string&? Текущий метод возвращает копию, которая не так эффективна. Возврат константной ссылки вместо этого вызовет какие-либо проблемы?

Ответы [ 12 ]

0 голосов
/ 25 сентября 2008

Я обычно возвращаю const &, если не могу. QBziZ приводит пример того, где это происходит. Конечно, QBziZ также утверждает, что std :: string имеет семантику копирования при записи, что сегодня редко встречается, так как COW требует много накладных расходов в многопоточной среде. Возвращая const & вы возлагаете бремя на вызывающего, чтобы сделать правильную вещь со строкой на конце. Но поскольку вы имеете дело с кодом, который уже используется, вы, вероятно, не должны его менять, если только профилирование не покажет, что копирование этой строки вызывает серьезные проблемы с производительностью. Тогда, если вы решите изменить его, вам нужно будет тщательно проверить, чтобы убедиться, что вы ничего не сломали. Надеюсь, другие разработчики, с которыми вы работаете, не делают отрывочных вещей, как в ответе Димы.

0 голосов
/ 25 сентября 2008

Зависит от того, что вам нужно сделать. Может быть, вы хотите, чтобы все вызывающие стороны изменили возвращаемое значение без изменения класса. Если вы вернете константную ссылку, она не будет летать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...