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

1 ... 145 146 147 [ 148 ] 149 150 151 ... 265


ры класса 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: }



1 ... 145 146 147 [ 148 ] 149 150 151 ... 265

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