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

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


функция GetFirstNameO возвращает константную строку и вы не можете использовать operator+ с константным объектом.

Чтобы устранить эту проблему, следует перегрузить функцию GetFirstNameO таким образом, чтобы она стала неконстантной:

const string & GetFirstNameO const { return itsFirstName; } String & GetFirstNameO { return itsFirstName; }

Как видите, возвращаемое значение больше не является константой, также как и сама функция-член. Изменения возвращаемого значения недостаточно для перефузки имени функции. Необходимо изменить константность самой функции.

Цена вложений

Важно отметить, что пользователю придется расплачиваться за каждый объект внешнего класса всякий раз при создании или копировании объекта Employee.

Снимите символы комментариев с операторов cout листинга 15.1 (строки 38, 51, 63, 75, 84 и 100), и вы увидите, как часто они вызываются. В листинге 15.3 представлена та же профамма, что и в листинге 15.2, только в этом примере добавлены операторы печати, которые будут показывать сообщения на экране всякий раз при выполнении конструктора класса Employee. Это позволит наглядно увидеть весь процесс создания объектов в профамме.


аРИМЕЧАНИЕ

До компиляции этого листинга разблокируйте строки 38, 51, 63, 75, 84 и 100 в листинге 15.1.

Аистинг 16.3. Конструкторы вдожвнных ндассов

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20

ffinclude String.hpp

class Employee {

public: Employee();

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

Employee(const Employees);

Employee & operator= (const Employee &);

const String & GetFirstNameO const

{ return ItsFirstName; } const String & GetLastNameO const { return itsLastName; const String & GetAddressO const { return itsAddress; } long GetSalaryO const { return itsSalary; }

void SetFirstName(const String & fName) { ItsFirstName = fName; }



21: void SetLastName(const String & IName)

22: { itsLastName = IName: }

23: void SetAddress(const String & address)

24: { itsAddress = address; }

25: void SetSalary(long salary) { itsSalary = salary; }

26: private:

27: String itsFirstName;

28; String ItsLastName;

29: String itsAddress;

30: long ItsSalary;

31: } ; 32:

33: Employee: :EmployeeO :

34; itsFirstNameC ),

35; itsLastName( ),

36: itsAddress( ),

37: itsSalary(O)

38: { } 39:

40; Employee::Employee(char * firstName, char ♦ lastName,

41; char * address, long salary):

42: itsFirstName(firstName),

43: itsLastName(lastName),

44; itsAddress(address),

45; ItsSalary(salary)

46; { }

48; Employee::Employee(const Employee & rhs);

49; itsFirstName( rhs, GetFirstNameO),

50: ltsLastName(rhs,GetLastName()),

51: itsAddress( rhs. GetAddressO),

52: itsSalary(rhs,GetSalaryO)

53: { }

55: Employee:: EmployeeO { } 56:

57: Employee & Employee::operator= (const Employee & rhs)

58: {

59: if (this == &rhs)

60: return this; 61:

62: ItsFirstName = rhs,GetFirstNameO;

63: ItsLastName = rhs.GetLastNameO;

64: itsAddress = rhs.GetAddressO;

65; itsSalary = rhs.GetSalaryO; 66:

67: return -this;

68: }

70: int mainO



71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

cout Creating Edie ,\ n ;

Employee Edle( Jane , Doe , 1461 Shore Parkway , 20000); Edle,SetSalary(20000);

cout Calling SetFirstName with char . ,\ n ; Edle,SetFirstName( Edythe );

cout Creating temporary string LastName ,\ n ; String LastName( Levine ); Edie,SetLastName(LastName);

cout Name; ;

cout Edie,GetFirstNameO,GetStringO;

cout Edie,GstLastNameO,GetStringO;

cout \ nAddress; ;

cout Edli,GetAddressO,GetStringO;

cout \ nSalary: ;

cout Edie,GetSalaryO;

cout endl; return 0;

3 4 5 6 7 8 9

10 11 12 13 14 15 16

Creating Edie ,

String(char ) constructor

String(char.) constructor

String(char*) constructor Calling SetFirstName with char

String(char*) constructor

String destructor Creating temporary string LastName

String(char ) constructor Name; Edythe Levine Address; 1461 Shore Parkway Salary; 20000

String destructor

String destructor

String destructor

String destructor

В листинге 15.3 используются классы, объявленные ранее в листингах 15,1 и 15.2.

Единственное отличие состоит в том, что операторы cout разблокированы. Чтобы упростить обсуждение, строки, выводимые профаммой на экран, были пронумерованы.

В строке 72 листинга 15.3 выводится сообщение Creating Edie которому соответствует первая строка вывода. Для создания объекта Edie класса Employee задаются четыре параметра. Для инициализации трех из них задействуются конструкторы класса String, о чем свидетельствуют три следующие строки вывода.

Строка 75 информирует о вызове функции SetFirstName. Следующая строка профаммы, Edie, SetFirstName( Edythe ), создает временный объект класса String из СфО-ковой константы Edythe , для чего вновь задействуются соответствующие консфукто-



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

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