|
Программирование >> Дополнительные возможности наследования
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.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |