Использование конструктора копирования ...214
Лучший путь понять, как работает конструктор копирования, — это увидеть его в действии. Рассмотрим приведённый ниже пример с классом Student.
//
/* CopyConstructor — работа конструктора копирования */
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <strings.h>
using namespace std ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
/* conventional constructor — обычный конструктор */
Student( char *pName = "no name" , int ssId = 0 )
{
strcpy( name , pName ) ;
id = ssId ;
cout << "Конструируем " << name << endl ;
}
/* Копирующий конструктор */
Student( Student& s )
{
strcpy( name , "Копия " ) ;
strcat( name , s.name ) ;
id = s.id ;
cout << "Сконструирована " << name << endl ;
}
~Student( )
{
cout << "Деструкция " << name << endl ;
}
protected :
_________________
214 стр. Часть 3. Введение в классы
char name[ MAXNAMESIZE ] ;
int id ;
} ;
/* fn — передача параметра по значению */
void fn( Student copy )
{
cout << "В функции fn( )" << endl ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student Chester( "Chester" , 1234 ) ;
cout << "Вызов fn( )" << endl ;
fn( Chester ) ;
cout << "Возврат из fn( )" << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
После запуска этой программы на экран будут выведены следующие строки:
Конструируем Chester
Вызов fn( )
Сконструирована Копия Chester
В функции fn( )
Деструкция Копия Chester
Возврат из fn( )
Press any key to continue...
Деструкция Chester
Давайте внимательно рассмотрим, как же работает эта программа. Обычный конструктор выводит первую строку; затем main( ) выводит строку "Вызов...". После этого С++ вызывает копирующий конструктор для создания копии объекта Chester ( которая и передаётся функции fn( ) в качестве аргумента ). Эта копия будет ликвидирована при возврате из функции fn( ) ; исходный же объект Chester ликвидируется при выходе из main( ).
Копирующий конструктор выглядит как обычный, но обладает особенностью получать в качестве аргумента ссылку на другой объект того же класса. ( Обратите внимание, что использованный в примере копирующий конструктор, помимо простого копирования объекта, делает кое-что ещё, например выводит строку "Конструируем копию...". Эту возможность выполнять кроме собственно копирования и другие действия можно будет с успехом применить для решения разных задач. Конечно, копирующие конструкторы обычно ограничиваются созданием копий уже существующих объектов, но на самом деле они могут делать всё, что угодно программисту. )
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ