Передача параметров в функцию по ссылке

Различают три способа передачи параметров в функцию:

1. По значению;

2. По указателям;

3. По ссылке.

Два последних способа очень похожи и вместе их называют передачей параметров в функцию по ссылке.

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

Пример передачи параметров в функцию по значению:

# include < iostream >

using namespace std;

void swap ( int x , int y ) ;

int main ( )

{

int x = 5, y = 10 ;

cout << "Main. Before swap, x: " << x << " y: " << y << " \n";

swap ( x , y ) ;

cout << "Main. After swap, x: " << x << " y: " << y << " \n";

return 0 ;

}

void swap ( int x, int y )

{ int temp;

cout << "Swap. Before swap, x: " << x << " y: " << y << " \n";

temp = x;

x = y;

y = temp;

cout << "Swap. After swap, x: " << x << " y: " << y << " \n";

}

Результат программы на экране будет иметь вид:

Main. Before swap, x: 5 y: 10

Swap. Before swap, x: 5 y: 10

Swap. After swap, x: 10 y: 5

Main. After swap, x: 5 y: 10

Проанализируйте изменения значений переменных x и y до обращения к функции, во время выполнения функции и после выхода из неё.

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

Пример. Требуется написать функцию, которая принимает два параметра (два целых числа) и вычисляет сумму и произведение этих чисел.

# include < iostream.h>

void SP ( int a , int b , int *S , int *P );

main( ) {

int x , y , z , R ;

cin >> x >> y ;

SP ( x , y , & z , & R ) ;

cout << ” s u m = ” << z ;

cout << ” p r o d u c t = ” << R ;

return 0 ;

}

void SP ( int a , int b , int *S , int *P )

{

*S = a + b ;

*P = a * b ;

}

В примере функция имеет смешанный список параметров. Первые два параметра передаются по значению, вторые два - по указателю.

При выполнении функции main ( ) в памяти создаются 4 локальные переменные x, y, z, R. При вызове функции SP в памяти будут созданы две переменные a и b и две переменные указатели S и P. В переменные a и b будут скопированы значения, хранящиеся в переменных x и y, а в переменные указатели S и P с помощью операции взятия адреса, будут скопированы адреса ячеек z и R.

Зная адреса ячеек z и R и используя операцию косвенной адресации, функция SP запишет результаты произведения и суммы двух чисел непосредственно в ячейки z и R.

Для передачи параметров по ссылке эта программа примет вид:

# include < iostream.h >

void SP ( int a , int b , int & S , int & P ) ;

main ( ) {

int x , y , z , R ;

cin >> x >> y ;

SP ( x , y , z , R ) ;

cout << ” s u m = ” << z ;

cout << ” p r o d u c t = ” << R ;

return 0 ;

}

void SP ( int a , int b , int & S , int & P )

{

S = a + b ;

P = a * b ;

}

В отличие от предыдущего способа, функция SP не создает дополнительных переменных S и P , а получая через список параметров адреса ячеек z и R , непосредственно записывает в них результат.

Задания к самостоятельной работе

1. Даны два катета прямоугольного треугольника. Написать функцию, определяющую гипотенузу и площадь треугольника. Функция не должна возвращать значение. Результат передается в главную программу main через список параметров. Функция должна иметь 4 параметра: 1-й катет, 2-й катет, гипотенузу, площадь. Реализовать передачу двух последних параметров по ссылке и по указателю.

2. Даны радиус основания и высота цилиндра. Написать функцию, вычисляющую площадь основания и объем цилиндра. Результат в главную программу передается через список параметров по указателю или по ссылке.

3. Даны курсы доллара и рубля к сому. Написать функцию, определяющую количество денег в долларах и рублях. Функция имеет 5 параметров: курс доллара, курс рубля, количество денег в сомах, в долларах и рублях.

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

5. Разработайте следующие целые функции:

a) функцию Celsius, которая возвращает температуру по Цельсию, эквивалентную температуре по Фаренгейту;

b) функцию Fahrenheit, которая возвращает температуру по Фарен­гейту, эквивалентную температуре по Цельсию;

c) используйте эти функции для написания программы, которая печатает таблицу, показывающую эквивалент по Фаренгейту всех температур по Цельсию от 0 до 100 градусов и эквивалент по Цельсию всех температур по Фаренгейту от 32 до 212 градусов. Сделайте листинг в аккуратном табулированном формате, с минималь­ным количеством строк при сохранении хорошей читаемости.

6. Напишите функцию quality_Points, которая вводит среднюю оценку студентов и если она в диапазоне 90-100, то возвращает 4, если в диапазоне 80-89, возвращает 3, если в диапазоне 70-79, возвращает 2, если в диапазоне 60-69, возвращает 1, и если средняя оценка меньше 60, то возвращает 0.

7. Напишите программу на C++ с двумя указанными ниже альтернативными функциями, каждая из которых просто ут­раивает переменную count, определенную в main.Затем сравните и противопоставьте эти два подхода. Вот эти две функции:

a) функция tripleCallByValue,в которую передается копия count по значению, в функции эта копия утраивается и возвращается соответствующее значение;

b) функция tripleByReference,в которую передается countпо ссылке посредством ссылочного параметра, а функция утраивает исходную копию countчерез ее псевдоним (т.е. ссылочный параметр).

Лабораторная работа 3

Наши рекомендации