|
Программирование >> Расширенная версия языка c++
Глава 4 указатели и ссылки /29 тически использует на которую указывает Нет необходимости (и опять не допускается) ставить знак *. Таким образом, параметр-ссылка полностью автоматизирует механизм передачи параметра посредством вызова функции по ссылке. Важно понимать следующее: адрес, на который указывает ссылка, вы изменить не можете. Например, если в предыдущей программе инструкция находилась бы внутри функции f(), ссылка по-прежнему указывала бы на переменную i в функции main(). Вместо инкрементирования адреса, на который указывает ссылка п, эта инструкция значение переменной (в данном случае это переменная i). имеют несколько преимуществ по сравнению с аналогичными (более или менее) альтернативными параметрами-указателями. Во-первых, с практической точки зрения нет необходимости получать и передавать в функцию адрес аргумента. При использовании параметра-ссылки адрес передается автоматически. Во-вторых, по мнению многих программистов, параметры-ссылки предлагают более понятный и элегантный интерфейс, чем неуклюжий механизм указателей. В-третьих, как вы увидите в следующем разделе, при передаче объекта функции через ссылку копия объекта не создается. Это уменьшает вероятность ошибок, связанных с построением копии аргумента и вызовом ее деструктора. уТримеры 1. Классическим примером передачи аргументов по ссылке является функция, меняющая местами значения двух своих аргументов. В данном примере в функции swapargsO ссылки используются для того, чтобы поменять местами два ее целых аргумента: #include <iostream> using namespace std; voi s(int &x, int Sy) ; int main () i - int i, j ; i =10; . J = 19; cou< i i , ; cout j : j \n ; swapargs (i, j) ; - 730 Самоучитель C+ + cou После перестановки; ; , ,.;.) iim . . j cou i , ; ,-, . cou ; j \п ; return 0; void int int t; t = x ; x = у; у = t; , Если бы при написании функции swapargs() вместо ссылок использовались указатели, то функция выглядела бы следующим образом: voi gs(int *x, int *y) int t; . - j: :. л . Mi.! .. , t - 4l, 4? I, *x = *y; hj - -L* Как видите, благодаря использованию ссылок в функции отпадает необходимость указывать знак *. 2. В следующей программе с помощью функции округляется значение типа double. Округляемое значение передается по ссылке. #include <iostreain> ttinclude <cmath> using namespace std; void int -iouble i = 100.4; out после округления ; lund ( i ) ; ut i \n ; л =10.9; cou после округления ; round(i ) ; cout i Упражнения 1. Напишите функции (), которая меняет знак своего целого параметра на противоположный. Напишите функцию двумя способами: первый - используя параметр-указатель и второй - параметр-ссылку. Составьте короткую программу для демонстрации обеих функций. 2. Что неправильно в следующей программе? ........ В этой программе есть ошибка #include <iostream> using namespace std; void triple(double Snum); int mainO double d = 7.0; triple(£d); cout d; return 0; Утроение значения числа void return 0; void round (double snum) double frac; double val; разложение num на целую и дробную части t 1 \ frac = modf( num, &val); , . ..,1*:. A .if (frac < 0.5) num = val; -,. .t ; ; . -.,1 ., else num = val + 1.0; , * , . , , В функции OTnd() для разложения числа на целую и дробную части указана редко используемая функция значением этой функ- ции является дробная часть; целая часть помещается в переменную, на которую указывает второй параметр функции modf().
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |