|
Программирование >> Аргументация конструирования
вый, но как быть, если побайтовая копия не совсем то, что нам нужно? Что., если мы хотим нечто иное? (Не спрашивайте у меня пока, что такое это иное и зачем оно нужно. Немного терпения!) У нас должна быть возможность самим определять, как будет создаваться копия объекта. i-L В C + + аргументы функции передаются по значению. Таким образом, в приведенном выше примере необходим копирующий конструктор, который будет выполнять копирование объекта ms при вызове функции fn (). Этот частный копирующий конструктор и есть student:: Student: (Students) (попробуйте-ка произнести эту скороговорку...). Использование конструктора копирования Лучший путь понять, как работает конструктор копирования, - это увидеть его в действии. Рассмотрим приведенный ниже пример с классом Student. #include <io3tream.h> #include <string.h> class Student public: обычный конструктор student (char *pName no name , int ssld = 0) i cout << Создаем нового студента << pNan\e \n ; strncpy (name, pName, sizeof (name) ) ; name[sizeof(name) -1] = \C; id = ssld; Копирующий конструктор student (Students, s) cout Конструируем копию s,name << \n ; strcpy(name, Копия ) ; strcat(name, s.name); id = ~Student() cout << Ликвидируем: << name << \n ,- protected: ciBrname(40] ; int i; fn принимает аргумент значению void fn(Student s) cout << Сообщение из функции fn()\n ; in int argcs, char* pArgs [ ] ) Student randy( Randy , 1234) ; cout Вызываем функцию fn()\n ; fn (randy) ; cout << Вернулись из fn()\n ; return 0; После запуска этой программы на экран будут выведены следующие строки: Создаем нового студента Randy Вызываем функцию f n () Конструируем копию Randy Сообщение из функции fп() Ликвидируем: Копия Randy Вернулись, из fп {) Ликвидируем: Randy Давайте внимательно рассмотрим, как же работает эта программа. Обычный конструктор выводит первую строку; затем mainO выводит строку Вызываем. . . . После этого C++ вызывает копирующий конструктор для создания копии объекта randy (которая и передается функции fn () в качестве аргумента). Эта копия будет ликвидирована при возврате из функции fn (); исходный же объект randy ликвидируется при втходе ИЗ main () . Копирующий конструктор выглядит как обычный, но обладает особенностью получать в качестве аргумента ссылку на другой объект того же класса. (Обратите внимание, что использованный в примере копирующий конструктор, помимо простого копирования объекта, делает кое-что еще, например выводит строку Конструируем копию. . . . Эту возможность выподнять кроме собственно копирования и другие действия можно будет с успехом применить для решения разных задач. Конечно, копирующие конструкторы обычно ограничиваются созданием копий уже существующих объектов, но на самом деле они могут делать все, что угодно программисту.) /сомфо€анил Копирующий конструктор важен ничуть не менее конструктора по умолчанию. Важен настолько, что C++ считает невозможным существование класса без копирующего конструктора. Если вы не создадите свою версию такого конструктора, C++ создаст ее за вас. (Это несколько отличается от конструктора по умолчанию, который создается только в том случае, если в вашем классе не определено вообще никаких конструкторов.) Копирующий конструктор, создаваемый C + + , выполняет поэлементное копирование всех членов-данных. Ранее копирующий конструктор, создаваемый С+ + , выпод-нял побитовое копирование. Отличие между этими методами заключается в том, что при поэлементном копировании для каждого члена класса вызываются соответствующие копирующие конструкторы (если они существуют), тогда как при побитовом копировании конструкторы не вызывались. Разницу в результатах можно увидеть, выполнив приведенный пример. tinclude <iostreara.h> tinclude <string.h> class Student { public: student (char *p№me = no name ) { cout << Создаем нового студента pName \n ; strncpy(name, pNarne, sizeof(name) ) ; name[sizeof(name) - 1] = \0; Student(Students s) cout Создаем копию от s.name \n ; strcpy(name, Копия ) ; strcat(name, s.name); --Student ( ) i cout << Ликвидируем << name << \n; protected: char name[40] ; class Tutor f public: Tutor(Students s) : student(s) вызываем копирующий конструктор для члена s tudent cout << Создаем учителя\п ; protected: Student student; void tutor) cout << Это сообщение из функции fr:()\n ; int main(int argcs, char* pArgs[]) { Student randy( Randy ) ; Tutor tutor(randy); cout << Вызываем функцию fn()\n ; fn(tutor) ; cout << Вернулись из функции fn( ) \n ; return Запуск этой программы приведет к выводу таких сообщений:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |