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

1 ... 143 144 145 [ 146 ] 147 148 149 ... 265


% Представленный в листинге 15.1 класс String напоминает Другой класс,

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

Статическая переменная-член ConstructorCount объявляется и инициализируется соответственно в строках 23 и 154. Значение этой переменной увеличивается на единицу при вызове любого конструктора класса String. Эти функции также заблокированы и будут использоваться в следующих листингах.

В листинге 15.2 объявляется класс Employee, содержащий три объекта класса String.

Листинг 15.Z. Класс Employee

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

ftinclude String.hpp

class Employee {

public: EmployeeO;

Employee(char *, char *, char *, long); EmployeeO;

Employee(const Employees.);

Employee & operator= (const Employee &);

const String & GetFirstNameO const

{ return itsFirstName; } const String & G9tLastName() const { return itsLastName; } const String & GetAddressO const { return ItsAddress; } long GetSalaryO const { return itsSalary; }

void SotFirstName(const String & fName)

{ itsFirstName = fName; } void SetLastName(oonst String & IName)

{ ItsLastName = INamo; } void SetAddres8(conat String & address)

{ ItsAddress = address; } void SotSalary(long salary) { JtsSalary = salary; } private; String ItsFirstName; String ItsLastName; String ItsAddress; long ItsSalary; } ;

Employee;;EmployeeO: itsFirstNameC ), ltsLastName( ), itsAddress( ),



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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

itsSalary(O) { }

Employee::Employee(char * firstName, char * lastName,

char * address, long salary);

itsFirstName(f1rstName),

itsLastName(lastName),

itsAddress(address),

itsSalary(salary) { }

Employee;;Efflployee(const Employee & rhs);

itsFi rstName(rhs,GetFirstName()),

itsLastName(rhs,GetLastName()),

itsAddress(rhs,GetAddress()),

itsSalary(rhs,GetSalary()) { }

Employee;; Employaa() { }

Employee & Employee;:operator= (const Employee & rhs) {

If (this == &rhs) return this;

ItsFlrstName = rhs,GetFirstName(); ItsLastName = rhs,GetLastName(); ItsAddress = rhs,GetAddress(); ItsSalary = rhs,GBtSalary();

return *this;

int mainO {

Employee Edie( Jane , Doe , 1461 Shore Parkway , 20000); Edie.SetSalary(50000); String LastName( Levine ); Edie,Set Last Name(LastName); Edie,SetFirstName( Edythe );

cout Имя: ;

cout Edie,GetFirstNameO,GetStringO;

cout Edie,GetLastNameO.GetStringO;

cout ,\ пАдрес: ;

cout Edie,GetAddressO,GetStringO;

cout << .\ пЗарплата: ;

cout Edie,GetSalary();

return 0;



Сохраните листинг 15.1 в файле с именем String.hpp. Затем всякий раз, когда понадобится класс String, вы сможете вставить листинг 15.1, просто добавив строку ffinclude String, hpp . Это первая строка в листинге 15.2.

Name: Edythe Levine.

Address: 1461 Shore Parkway. Salary: 50000

В листинге 15.2 объявляется класс Employee, переменными-членами которого выступают три объекта класса String - itsFirstName, itsLastName и itsAddress. В строке 72 создается объект Employee, который инициализируется четырьмя значениями. В строке 73 вызывается метод доступа SetSalary класса Employee, который принимает константное значение 50000. В реальной программе это значение определялось бы либо динамически в процессе выполнения профаммы, либо устанавливалось бы константой.

В строке 74 создается и инициализируется строковой константой объект класса String, который в строке 75 используется в качестве аргумента функции SetLastName().

В строке 76 вызывается метод SetFirstName класса Employee с еще одной строковой константой в качестве параметра. Однако если вы обратитесь к объявлению класса Employee, то увидите, что в нем нет функции SetFirstName(), принимающей строку символов как аргумент. Для функции SetFirstNameO в качестве параметра задана константная ссылка на объект String. Тем не менее компилятор не покажет сообщения об ощибке, поскольку в строке 9 листинга 15.1 объявлен конструктор, создающий объект String из строковой константы.

Доступ к членам вложенного класса

в классе Employee не объявлены специальные методы доступа к переменным-членам класса String. Если объект Edie класса Employee попытается напрямую обратиться к переменной-члену itsLen, содержащейся в его собственной переменной-члене ItsFirstName, это приведет к возникновению ощибки компиляции. Однако в таком обращении нет необходимости. Методы доступа класса Employee просто создают интерфейс для класса String, и классу Employee нет нужды беспокоиться о деталях выполнения класса String, а также о том, каким образом собственная целочисленная переменная-член ItsSalary хранит свое значение.

Шольтрацоя уоступа к влвжвнным классам

Вы, наверное, уже заметили, что в классе String перефужается operator+. В классе Employee доступ к перефуженной функции operator+ заблокирован. Дело в том, что в объявлениях методов доступа класса Employee указано, что все эти методы, такие как GetFirstNameO, возвращают константные ссылки. Поскольку функция operator+ не является (и не может быть) константой (она изменяет объект, для которого вызывается), попытка написать следующую сфоку приведет к сообщению об ощибке компиляции:

String buffer = Edie, GetFirstNameO + Edie. GetLastNameO;



1 ... 143 144 145 [ 146 ] 147 148 149 ... 265

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