|
Программирование >> Дополнительные возможности наследования
ры класса String (см. 6-ю строку вывода). Обратите внимание, что этот временный объект уничтожается сразу же после присвоения его значения переменной-члену, о чем свидетельствует вызов деструктора класса String (см. 7-ю строку вывода). Присвоив имя, профамма приступает к присвоению фамилии служащего. Это можно было бы выполнить так же, как и в случае с присвоением имени с помощью автоматически создаваемого временного объекта класса String. Но чтобы показать все возможности, в сфоке 78 явно создается объект класса String. Конструктор, создающий этот объект, дал о себе знать 9-й строкой вывода. Деструктор не вызывается, поскольку этот объект не удаляется до тех пор, пока не выйдет за фаницы своей области видимости в конце функции. Наконец профамма выводит на экран персональные сведения о служащем и выходит за область видимости объекта Employee, в результате чего вызываются четыре деструктора класса для удаления объектов этого класса, вложенных в объект Employee, и созданного ранее временного объекта LastName. Передача оОъекта как значеноя в листинге 15.3 показано, как создание одного объекта Employee приводит к вызову пяти конструкторов класса String. Листинг 15.4 - это еще один переписанный вариант профаммы. В нем нет дополнительных операторов вывода помимо представленных в листинге 15.1 (сейчас они разблокированы) и используется статическая переменная-член Const ructorCount, объявленная в классе String. Как следует из объявления в листинге 15.1, значение переменной ConstructorCount увеличивается на единицу при каждом вызове консфукгора класса String. В конце профаммы, представленной в листинге 15.4, объект Employee передается на печать сначала как ссылка, а затем как значение. Статическая переменная-член ConstructorCount отслеживает, сколько объектов класса String создается при разных способах передачи объекта Employee как парамефа функции. примечание Перед компиляцией этого листинга в программе листинга 15.1 дополнительно к тем строкам, которые были разблокированы для листинга 15.3, следует снять символы комментариев со строк 23, 39, 52, 64, 76 и 153. Аисшш 15.4. пврвуача оОъвкта как значения 3 4 5 6 7 8 9 10 11 12 13 14 15 ffinclude String.hpp class Employee { public: EmployeeO; Employee(char *, char ♦, char *, long); Employee(); Employee(const Employees); Employee & operator= (const Employee &); const String & GetFirstNameO const { return ItsFirstName; } const String & GetLastNameO const { return ItsLastName; 17 18 19 20 21 22 23 24 25 26 27 28 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 61 62 63 64 65 const String & GetAddressO const { return itsAddress; } long GetSalaryO const { return itsSalary; } void SetFirstName(const String & fName) { ItsFirstName = fName; } void SetLastName(const String & IName) { ItsLastName = IName; } void SetAddress(const String & address) { itsAddress = address; } void SetSalary(long salary) { itsSalary = salary; } private: String ItsFirstName; String ItsLastName; String itsAddress; long itsSalary; } ; Employee::Employee(): itsFlrstNameCO, itsLastNameC ), itsAddressC ), itsSalary(O) { } Employee::Employee(char ♦ firstName, char * lastName, char * address, long salary): itsFirstName(firstName), ItsLastName(lastName), itsAddress(address), itsSalary(salary) { } Employee::Employee(const Employee & rhs): itsFirstName(rhs. GetFirstNameO), itsLastName(rhs, GetLastNameO), itsAddress (rhs. GetAddressO), itsSalary(rhs,GetSalary()) { } Employee;: Employee() { } Employee & Employee::operator= (const Employee & rhs) { if (this == &rhs) return *this; itsFirstName = rhs,GetFirstNameO; ItsLastName = rhs.GetLastNameO; itsAddress = rhs. GetAddressO; itsSalary = rhs.GetSalaryO; 67: return this; 68: } 70; void PrintFunc(Employee); 71; void rPrlntFunc(const Employee&); 73; Int mainO 74; { 75; Employee Edle( Jano , Doe . 1461 Shore Parkway , 20000); 76; Edle,SetSalary(20000); 77; Edie,SetFlrstName( Edythe ); 78; String LastNameCLGvlne ); 79; Edl6,SetLastName(LastName); 81: cout Constructor count: ; 82; cout << String;:ConstructorCount endl; 83; rPrlntFunc(Edle); 84; cout Constructor count: ; 85; cout String:;ConstructorCount endl; 86; PrintFunc(Edle); 87; cout Constructor count: ; 88: cout String::ConstructorCount endl; 89; return 0; 90: } 91: void PrintFunc (Employee Edie) 92; { 94: cout Name: ; 95: cout Edie.GetFirstNameO,GetStringO; 96: cout Edie,GetLastNameO.GetStringO; 97: cout << .\ nAddress: ; 98: cout Edie,GetAddressO,GetStringO; 99: cout .\ nSalary: : 100: cout Edie.GetSalaryO; 101: cout endl; 102: 103: } 104: 105: void rPrintFunc (const Employees. Edie) 106; { 107; cout Name: ; 108; cout Edie.GetFirstNameO.GetStringO; 109: cout Edie.GetLastNameO.GetStringO; 110: cout \ nAddress: ; 111; cout Edie.GetAddressO.GetStringO; 112: cout \ nSalary; ; 113: cout Edie.GetSalaryO; 114: cout endl; 115: }
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |