2015-01-07 4 views
-4

Каково соглашение о возврате значений в функции?Оператор возврата Retuse или возврат по параметру

Есть ли оба эти исключения или один стиль предпочтительнее другого?

MyObj 
do_something(int n); 

void 
do_something(int n, MyObj& obj); 

Thanks!

Редактировать: Извините, я вернусь по значению в первом случае.

+2

Нет такого соглашения, это зависит от ваших конкретных случаев использования. –

+0

'MyObj & do_something (int n);' скорее всего, вернется к обвисшей ссылке, это не хорошо. –

+2

Скорее всего, вы хотите вернуться по значению. – juanchopanza

ответ

0

Вы передаете MyObj референтом не потому, что это стандарт, но чтобы не копировать MyObj данные, которые будут отображаться, если вы передадите его по значению. Вы также можете передать его по указателю

void 
do_something(int n, MyObj* obj); 

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

Вы также можете передавать многочисленные переменные в свою функцию таким образом, чтобы их можно было модифицировать без использования инструкции return.

Имея это в виду, тем лучше использование для return заявления в вашем Fuction чтобы отслеживать ваше поведение FUCTION - если ваш Funtion терпит неудачу в какой-то момент вы можете вернуть соответствующий код ошибки:

bool do_something(int foo) 
{ 
if(foo<0) 
{ 
return false;// something went wrong - exit with error statement 
} 

// do something 

return true; // everything is fine - exit with success statement 
} 

Вы можете использовать enum strutures для лучшего управления ошибками, если хотите.

Получение modyfied данных от функции return является хорошей идеей в тех случаях, когда ничто не может пойти не так, как в некоторых базовых вычислениях, например.

0

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

Самый большой аргумент в пользу возвращаемого значения состоит в том, что это означает, что код клиента не должен определять экземпляр перед вызовом функции . Если тип, о котором идет речь, не поддерживает конструкцию по умолчанию (и много определенных пользователем типов не будет), то вы не можете использовать параметры . И все, что может быть использовано в выражении, должно быть , возвращаемое значением, так как вы не можете использовать параметр out в выражении . (С технической точки зрения, C++ не поддерживает параметры, только in-out, так как если вы передаете ссылку или указатель, она должна ссылаться на или указывать на действительный объект. Когда мы говорим об исходных параметрах в C++, мы обычно имели в виду только то, что функция игнорирует любое предыдущее значение, а не , что вы можете передать что-то без предыдущего значения. исключение составляет основных типов, как int, которые могут существовать в неинициализированном состоянии.)

наиболее Частый случай использования параметров - для операций, которые могут сбой (для которых отказ не является исключительным условием). Классический пример - чтение буфера и т. Д .; функция read будет вернуть код состояния, указывающий на успех или неудачу (иногда в форме целого числа, определяющего, сколько байтов было успешно прочитано, возможно с -1 в качестве отчётного значения для истинных ошибок, в отличие от конца файла ). Вы могли бы создать более или менее сложную структуру, чтобы вернуть всю необходимую информацию, но в этом нет никакого смысла, , так как вам придется обрабатывать ее отдельно в любом случае.

Другой частый случай, когда у вас есть (скрытый) параметр, находится в не-константных функциях члена. В этом случае роль функции равна , чтобы изменить состояние объекта, поэтому, естественно, он обрабатывает объект как параметр in-out.

Смежные вопросы