Программирование >>  Дополнительные возможности наследования 

1 ... 75 76 77 [ 78 ] 79 80 81 ... 265


49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

oout years o](l\ ii ;

cout << CalJlng FunctionTwo,.,\ n ;

FuncUonTwo(Frt3ky);

cout << Frisky is ;

cout << Frisky.GolAgoO:

cout << years oUI\ n ;

return 0; }

functlonTwo, passes a const pointer

const SimpleCat const FunctionTwo (const SimpleCat * const theCat) {

oout << Function Two, Returning .\ n ;

cout Frisky is now thcCat->GetAge():

cout << years old \ n ;

thoCat->SotAgo(8): const!

return theCat;

>\ m Making a oat.

Simple Cat constructor , Frisky is 1 years old Frisky is 5 years old Calling FunctionTwo , FunctionTwo, Returning , Frisky is now 5 years old Frisky is 5 years old Simple Cat Destructor ,

y, в класс SimpleCat были добавлены две функции доступа к данным: метод GetAgeO (строка 13), который является константной функцией, и метод SetAgeO (строка 14), который не является константным. В этот класс была также добавлена переменная-член itsAge (строка 17).

Конструктор, конструктор-копировщик и деструктор по-прежнему определены для вывода на экран своих сообщений. Однако конструктор-копировщик ни разу не вызывался, поскольку объект был передан как ссылка и поэтому никаких копий объекта не создавалось. В строке 41 был создан объект со значением возраста, заданным по умолчанию. Это значение выводится на экран в строке 42.

В строке 46 переменная itsAge устанавливается с помощью метода доступа SetAge, а результат этой установки выводится на экран в строке 47. В этой программе функция FunctionOne не используется, но вызывается функция FunctionTwoO, которая слегка изменена. Ее объявление занимает строку 36. На этот раз и параметр, и значение возврата объявляются как константные указатели на константные объекты.

Поскольку и параметр, и возвращаемое значение передаются как ссылки, никаких копий не создается и конструктор-копировщик не вызывается. Однако указатель в функции FunctionTwoO теперь является константным, следовательно, к нему не может применяться неконстантный метод SetAge(). Если обращение к методу SetAgeO в строке 64 не было бы закомментировано, программа не прошла бы этап компиляции.



Обратите внимание, что объект, создаваемый в функции main(), не является константным и объект Frisky может вызвать метод SetAge(). Адрес этого обычного объекта передается функции FunctionTwoO, но, поскольку в объявлении функции FunctionTwo() заявлено, что передаваемый указатель должен быть константным указателем на константный объект, с этим объектом функция обращается так, как если бы он был константным!

Ссылки в качБствв альтврнативы

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

Поскольку, как вам известно, объект никогда не бывает нулевым, внутреннее содержание функции упростилось бы, если бы ей вместо указателя передавалась ссылка. Подтверждение этим словам вы найдете в листинге 9.12.

Листинг 9.12. Передачи ссыапк на пОъекты

Листинг 9.12,

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

dinclude <iostream.h>

class SimpleCat {

public:

SimpleCatO; SimpleCat(SimpleCat&); SimpleCatO:

int GetAgeO const { return itsAge; > void SetAge(int age) { itsAge = age; }

private:

int itsAge;

SimpleCat: : SimpleCatO {

cout << Simple Cat Constructor .\n ; itsAge = 1;

SimpleCat;:Simp]oCat(SlmploCat&) {

OQUt Simple Cat Copy Conatructor ,\n :



29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

SimpleCat::SlmpleCat() {

cout Simple Cat Destructor..,\n ;

const SimpleCat & FunctionTwo (const SimpleCat & theCat);

int mainO {

cout Making a cat...\ n ; SimpleCat Frisky;

cout << Frisky is Frisky. GetAgeO years old\ n int age = 5; Frisky.SetAge(age);

cout Frisky is Frisky. GetAgeO years old\ n cout Calling FunctionTwo...\ n ; FunctionTwo(Frisky);

cout << Frisky is << Frisky. GetAgeO << years old\ n return 0; }

FunctionTwo, passes a ret to a const object

const SimpleCat & FunctionTwo (const SimpleCat & theCat)

cout << Function Two. Returning...\ n ;

cout Frisky is now theCat. GetAgeO;

cout << years old \ n ;

theCat.SetAge(8); const!

return theCat;

Making a cat... Simple Cat constructor... Frisky is 1 years old Frisky is 5 years old Calling FunctionTwo... FunctionTwo. Returning... Frisky is now 5 years old Frisky is 5 years old Simple Cat Destructor...

Результат работы этой программы идентичен результату, показанному после листинга 9.11. Единственное существенное изменение - функция FunctionTwoO теперь принимает и возвращает ссылки на константный объект. И вновь-таки работа со ссылками несколько проще, чем работа с указателями, хотя при этом достигается та же экономия средств и эффективность выполнения, а также обеспечивается надежность за счет использования спецификатора const.



1 ... 75 76 77 [ 78 ] 79 80 81 ... 265

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