Возвращаемые значения

Использование предложения return

Совет

Использование аргументов

 

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

Когда вы создаете функцию, которая принимает один или больше аргументов, переменные, которые будут принимать эти аргументы, так же должны быть объявлены. Эти переменные называются параметрами функции. Ниже приведен пример определения функции с именем bох(), которая вычисляет объем коробки и выводит результат на экран. Она имеет три параметра, характеризующие длину (length), ширину (width) и высоту (height) коробки:

 

void box(int length, int width, int height)

{

cout << "объем коробки равен " << length * width * height << "\n" ;

}

 

Каждый раз, когда вызывается функция box(), она вычисляет объем коробки, умножая значения, передаваемые ей в переменные length, width и height.

Вызывая box(), вы должны задать три аргумента, например:

 

box(7, 20, 4) ;

box(50, 3, 2) ;

box(8 , 6 , 9 ) ;

 

Значения, указанные между круглыми скобками, представляют собой аргументы, передаваемые в box (), причем значение каждого аргумента копируется в соответствующий ему параметр. Таким образом, при первом вызове box () 7 копируется в length, 20 копируется в width, а 4 копируется в height. При втором вызове box () 50 копируется в length, 3 копируется в width, а 2 копируется в height. При третьем вызове 8 копируется в length, 6 копируется в width, а 9 копируется в height.

Приведенная ниже программа демонстрирует использование функции bох():

 

// Простая программа, демонстрирующая использование bох().

 

#include <iostream>

using namespace std;

 

void box(int length, int width, int height); // Прототип box()

 

int main()

{

box (7 , 20, 4) ;

box(50, 3, 2);

box (8, 6 , 9 ) ;

return 0;

}

// Вычисление объема коробки.

void box(int length, int width, int height)

{

cout << "объем коробки равен " << length * width * height << "\n" ;

}

 

Вывод программы:

 

объем коробки равен 560

объем коробки равен 300

объем коробки равен 432

 

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

 

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

Предложение return имеет две формы: одна позволяет вернуть значение, другая не делает этого. Мы начнем с варианта предложения return, который не возвращает значения. Если функция имеет тип возврата void (т. е. функция не возвращает никакого значения), используется следующая форма предложения return:

 

return;

 

Если в тексте функции встречается предложение return, выполнение немедленно возвращается в вызывающий код. Любые строки, остающиеся в функции, игнорируются. Рассмотрим, например, следующую программу:

 

// Использование предложения return.

 

#include <iostream>

using namespace std;

 

void f () ;

 

int main ()

{

cout << "Перед вызовом\n";

f();

cout << "После вызова\n";

return 0;

}

 

// функция void, использующая return.

void f()

{

cout << "Внутри f()\n";

return;

cout <<"Это не будет выводиться.\n";

}

 

Ниже приведен вывод программы:

 

Перед вызовом

Внутри f()

После вызова

 

Как видно из вывода программы, f() возвращается в main( ), как только в f() встречается предложение return. Второе предложение выполняться никогда не будет.

Вот более полезный пример использования предложения return. Функция power(), включенная в приведенную ниже программу, выводит результат возведения целого числа в целую положительную степень. Если показатель степени отрицателен, предложение return заставляет функцию завершиться, не пытаясь вычислить результат.

 

#include <iostream>

using namespace std;

 

void power(int base, int exp);

 

int main()

{

power(10, 2);

power(10, -2);

 

return 0;

}

// Возведение целого числа в целую положительную степень,

void power(int base, int exp)

{

if(exp < 0) return; // He умею работать с отрицательными показателями.

int i;

for(i=1 ; exp; exp--) i = base * i;

cout << "Ответ: " << i;

}

 

Вот вывод программы:

 

Ответ: 100

 

Если exp отрицательно (как это имеет место во втором вызове), power() возвращается, обходя весь остаток функции.

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

 

void f() {

 

// …

 

switch (с) {

case 'a': return;

case 'b' : // ...

case 'c': return;

)

if (count < 100) return;

// …

}

 

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

 

 

Функция может вернуть значение в вызывающий ее код. Возвращаемое значение представляет собой способ получить информацию из функции. Для возврата значения следует использовать второй вариант предложения return:

 

return значение;

 

Здесь значение — это то значение, которое возвращается функцией в вызывающий ее код. Эта форма предложения return может использоваться только с функциями, не возвращающими void.

Функция, возвращающая значение, должна задать тип этого значения. Тип возврата должен быть совместим с типом данного, используемого в предложении return. Если это не так, во время компиляции будет зафиксирована ошибка. В объявлении функции может быть указан любой допустимый в С++ тип данного, за исключением того, что функция не может вернуть массив.

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

 

// Возврат значения.

#include <iostream>

using namespace std;

 

int box(int length, int width, int height); // вернем объем

 

int main()

{

int answer;

answer = box(10, 11, 3); // присвоим возвращаемое значение

cout << "Объем равен " << answer;

return 0;

}

// Эта функция возвращает значение.

int box(int length, int width, int height)

{

return length * width * height ;//Вернем объем.

}

 

Вот вывод программы:

 

Объем равен 330

 

В этом примере bох() возвращает значение length * width * heightc помощью предложения return. Это значение присваивается переменной answer. Другими словами, значение, возвращаемое предложением return становится значением функции bох() в вызывающей программе.

Поскольку функция bох()возвращает значение, ее объявление не предваряется ключевым словом void. (Вспомним, что void используется только если функция не возвращает значения.) Вместо этого bох() объявлена, как возвращающая значение типа int. Обратите внимание на то, что тип возвращаемого функцией значения указывается перед ее именем как в прототипе, так и в определении.

Разумеется, int не является единственным типом, который может возвращаться функцией. Как уже отмечалось, функция может вернуть любой тип за исключением массива. Например, в приведенной ниже программе функция bох() модифицирована так, что она принимает параметры типа double и возвращает значение типа double:

 

// Возврат значения типа double.

#include <iostream>

using namespace std;

 

// используем данные типа double

double box(double length, double width, double height);

 

int main ()

{

double answer;

answer = box(10.1, 11.2, 3.3); //присвоим возвращаемое значение

cout << "Объем равен " << answer;

return 0 ;

}

// Этот вариант box использует данные типа double,

doubie box(double length, double width, double height)

{

return length * width * height ;

}

 

Вот вывод этой программы:

 

Объем равен 373.296

 

Еще одно замечание: Если функция типа не-void осуществляет возврат, встретив закрывающую фигурную скобку, возвращается неопределенное (т. е. неизвестное) значение. В силу своеобразной особенности формального синтаксиса С++, в не-void функциях нет необходимости обязательно выполнять предложение return. Такое может случиться, если конец функции достигнут прежде, чем в ней встретилось предложение return. Поскольку, однако, функция объявлена как возвращающая значение, значение все же будет возвращено — несмотря на то, что оно является "мусором". Разумеется, хороший стиль программирования требует, чтобы создаваемые вами не-void функции возвращали значение посредством явного выполнения предложения return.