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

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


4.7. Передача ссылок на объекты

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

Решает эту проблему передача объекта по ссылке. (Другое решение, о котором будет рассказано в главе 5, подразумевает использование конструктора копий.) При этом копия объекта не создается, и поэтому при возвращении функцией своего значения деструктор не вызывается. Тем не менее, запомните: изменения объекта внутри функции влияют на исходный объект, указанный в качестве аргумента функции.

; Замечание. . .

Очень важно понимать, что ссылка не указатель, хотя она и указывает на адрес объекта. Поэтому при передаче объекта по ссылке для доступа к его членам исполъзуется оператор точка (.), а не стрелка (->}.

1. В следующем примере на экран выводится значение, передаваемое объекту по ссылке, но сначала рассмотрим версию программы, в которой объект типа myclassO передается в функцию f() по значению:

ttinclude <iostream>

using namespace std;

clas lass { ...

int who; public:

myclass(int n) ( who = n;

cout Работа конструктора who \n ;

num = 3* num;

3. Перечислите преимущества параметров-сс1лок.



~myclass() OTt Работа ора wh \п ; }

int id() { return who; } .-г,.- -

}.

/ / о передается по значению

void f (myclass о)

cout < Получено o.id() \n ;

} ,

int mainO ( ,

myclass x(l) f (X) ;

return 0;

Эта функция выводит на экран следующее:

Работа конструктора 1 Порчено 1

Работа деструктора 1 Работа деструктора 1

Как видите, деструктор вызывается дважды: первый раз, когда после выполнения функции f() удаляется копия объекта 1, а второй раз - по окончании

программы.

С другой стороны, если изменить программу так, чтобы использовать параметр-ссылку, то копия объекта не создается и поэтому после выполнения функции f() деструктор не вызывается:

#include <iostream> , .

using namespace std;

class myclass { i . - .

int who;

public:

myclass (int n) { . ,.,

who = n; .... с

cout Работа конструктора who \n ;

-myclass 0 { cout Работа деструктора who << \n ; }

int id (] { return who; }

Теперь о передается по ссхлке void I(myclass &o)



ft отметьте, что по-прежнему используется оператор cout Получено o.idO \п ;

int mainO . -,

myclass х (1) ; ., ,

f (к); return 0;

Эта версия предыдущей программы выводит на экран следующее:

Работа укгора 1

Получено 1

Работа деструктора 1


Для доступа к членам объекта по ссылке следует указывать оператор точка (.), а не стрелка (->).

YnpaAHeHUii

1. Что неправильно в следующей программе? Покажите, как она может быть исправлена с помощью параметра-ссылки.

В этой программе есть ошибка

#include <iostream>

#include <cstring>

♦include <cstdlib> ,. .

using namespace

class {

char *p; public:

strtype (char *s) ;

~3trtype() { delete И p; }

cha t() { return p; } . .

};

strtype: :strtype (char *s)

int 1; :



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

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