Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Передача объекта как значенияСодержание книги
Поиск на нашем сайте
В листинге 15.3 показано, как создание одного объекта Employee приводит к вызову пяти конструкторов класса String. Листинг 15.4 — это еще один переписанный вариант программы. В нем нет дополнительных операторов вывода помимо представленных в листинге 15.1 (сейчас они разблокированы) и используется статическая переменная-член ConstructorCount, объявленная в классе String. Как следует из объявления в листинге 15.1, значение переменной ConstructorCount увеличивается на единицу при каждом вызове конструктора класса String. В конце программы, представленной в листинге 15.4, объект Employee передается на печать сначала как ссылка, а затем как значение. Статическая переменная-член ConstructorCount отслеживает, сколько объектов класса String создается при разных способах передачи объекта Employee как параметра функции.
Примечание: Перед компиляцией этого листинга в программе листинга 15.1 дополнительно к тем строкам, которые были разблокированы для листинга 15.3, следует снять символы комментариев со строк 23, 39, 52, 64, 76 и 153.
Листинг 15.4. Передача объекта как значения 1: #include "String.hpp" 2: 3: class Employee 4: { 5: 6: public: 7: Employee(); 8: Employee(char *, char *, char *, long); 9: ~Employee(); 10: Employee(const Employee&); 11: Employee & operator= (const Employee &); 12: 13: const String & GetFirstName() const 14: { return itsFirstName; } 15: const String & GetLastName() const { return itsLastName; } 16: const String & GetAddress() const { return itsAddress; 17: long GetSalary() const { return itsSalary; } 18: 19: void SetFirstName(const String & fName) 20: { itsFirstName = fName; } 21: void SetLastName(const String & lName) 22: { itsLastName = lName; } 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::Employee(); 34: itsFirstName(""), 35: itsLastName(""), 36: itsAddress(""), 37: itsSalary(0) 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: { } 47: 48: Employee::Employee(const Employee & rhs): 49: itsFirstName(rhs.GetFi rstName()), 50: itsLastName(rhs.GetLastName()), 51: itsAddress(rhs.GetAddress()), 52: itsSalary(rhs.GetSalary()) 53: { } 54: 55: Employee::~Employee() { } 56: 57: Employee & Employee::operator= (const Employee & rhs) 58: { 59: if (this == &rhs) 60: return *this; 61: 62: itsFirstName = rhs.GetFirstName(); 63: itsLastName = rhs.GetLastName(); 64: itsAddress = rhs.GetAddress(); 65: itsSalary = rhs.GetSalary(); 66: 67: return *this; 68: } 69: 70: void PrintFunc(Employee); 71: void rPrintFuno(const Employee&): 72: 73: int main() 74: { 75: Employee Edie("Jane","Doe","1461 Shore Parkway", 20000); 76: Edie.SetSalary(20000); 77: Edie.SetFirstName("Edythe"); 78: String LastName("Levine"); 79: Edie.SetLastName(LastName); 80: 81: cout << "Constructor count: "; 82: cout << String;:ConstruotorCount << endl; 83: rPrintFunc(Edie); 84: cout << "Constructor count: "; 85: cout << String::ConstructorCount << endl; 86: PrintFunc(Edie); 87: cout << "Constructor count: "; 88: cout << String::ConstructorCount << endl; 89: return 0; 90: } 91: void PrintFunc (Employee Edie) 92: { 93: 94: cout << "Name: "; 95: cout << Edie.GetFirstName().GetString(); 96: cout << " " << Edie.GetLastName().GetString(); 97: cout << ".\nAddress: "; 98: cout << Edie.GetAddress().GetString(); 99: cout << ".\nSalary: "; 100: cout << Edie.GetSalary(); 101: cout << endl; 102: 103: } 104: 105: void rPrintFunc (const Employee& Edie) 106: { 107: cout << "Name: "; 108: cout << Edie.GetFirstName().GetString(); 109: cout << " " << Edie.GetLastName().GetString(); 110: cout << "\nAddress: "; 111: cout << Edie.GetAddress().GetString(); 112: cout << "\nSalary: "; 113: cout << Edie.GetSalary(); 114: cout << endl; 115: }
Результат: String(char*) constructor String(char*) constructor String(char*) constructor String(char*) constructor String destructor String(char*) constructor Constructor count: 5 Name: Edythe Levine Address: 1461 Shore Parkway Salary: 20000 Constructor count; 5 String(String&) constructor String(String&) constructor String(String&) constructor Name: Edythe Levine Address: 1461 Shore Parkway Salary: 20000 String destructor String destructor String destructor Constructor count: 8 String destructor String destructor String destructor String destructor
Анализ: Как видно по данным, выводимым программой, в процессе создания одного объекта Employee создается пять объектов класса String. Когда объект Employee передается в функцию rPrintFunc() как ссылка, дополнительные объекты Employee не создаются. Соответственно не создаются и дополнительные объекты String. (Все они, кстати, также автоматически передаются как ссылки.) Когда объект Employee передается в функцию PrintFunc() как значение, создается копия объекта Employee вместе с тремя объектами класса String (для этого используется конструктор-копировщик).
|
||||
Последнее изменение этой страницы: 2016-12-10; просмотров: 331; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.172.189 (0.01 с.) |