Как очень общее правило, это, как правило, лучше предпочесть функциональный стиль программирования, где каждая функция возвращает значение, и изменяет ни глобального состояния, ни другие данные, в том числе все, косвенно через указатель или ссылку параметров. Это общее правило, , но, безусловно, есть исключения.
Самый большой аргумент в пользу возвращаемого значения состоит в том, что это означает, что код клиента не должен определять экземпляр перед вызовом функции . Если тип, о котором идет речь, не поддерживает конструкцию по умолчанию (и много определенных пользователем типов не будет), то вы не можете использовать параметры . И все, что может быть использовано в выражении, должно быть , возвращаемое значением, так как вы не можете использовать параметр out в выражении . (С технической точки зрения, C++ не поддерживает параметры, только in-out, так как если вы передаете ссылку или указатель, она должна ссылаться на или указывать на действительный объект. Когда мы говорим об исходных параметрах в C++, мы обычно имели в виду только то, что функция игнорирует любое предыдущее значение, а не , что вы можете передать что-то без предыдущего значения. исключение составляет основных типов, как int
, которые могут существовать в неинициализированном состоянии.)
наиболее Частый случай использования параметров - для операций, которые могут сбой (для которых отказ не является исключительным условием). Классический пример - чтение буфера и т. Д .; функция read
будет вернуть код состояния, указывающий на успех или неудачу (иногда в форме целого числа, определяющего, сколько байтов было успешно прочитано, возможно с -1 в качестве отчётного значения для истинных ошибок, в отличие от конца файла ). Вы могли бы создать более или менее сложную структуру, чтобы вернуть всю необходимую информацию, но в этом нет никакого смысла, , так как вам придется обрабатывать ее отдельно в любом случае.
Другой частый случай, когда у вас есть (скрытый) параметр, находится в не-константных функциях члена. В этом случае роль функции равна , чтобы изменить состояние объекта, поэтому, естественно, он обрабатывает объект как параметр in-out.
Нет такого соглашения, это зависит от ваших конкретных случаев использования. –
'MyObj & do_something (int n);' скорее всего, вернется к обвисшей ссылке, это не хорошо. –
Скорее всего, вы хотите вернуться по значению. – juanchopanza