|
Программирование >> Расширенная версия языка c++
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; :
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |