Программирование >>  Расширенная версия языка c++ 

1 ... 38 39 40 [ 41 ] 42 43 44 ... 227


Глава 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().



1 ... 38 39 40 [ 41 ] 42 43 44 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика