Программирование >>  Аргументация конструирования 

1 ... 60 61 62 [ 63 ] 64 65 66 ... 108


вый, но как быть, если побайтовая копия не совсем то, что нам нужно? Что., если мы хотим нечто иное? (Не спрашивайте у меня пока, что такое это иное и зачем оно нужно. Немного терпения!) У нас должна быть возможность самим определять, как

будет создаваться копия объекта.

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

Запуск этой программы приведет к выводу таких сообщений:



1 ... 60 61 62 [ 63 ] 64 65 66 ... 108

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