/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
После запуска этой программы на экран будут выведены следующие строки:
Конструируем Chester
Вызов fn( )
Сконструирована Копия Chester
В функции fn( )
Деструкция Копия Chester
Возврат из fn( )
Press any key to continue...
Деструкция Chester
Давайте внимательно рассмотрим, как же работает эта программа. Обычный конструктор выводит первую строку; затем main( ) выводит строку "Вызов...". После этого С++ вызывает копирующий конструктор для создания копии объекта Chester ( которая и передаётся функции fn( ) в качестве аргумента ). Эта копия будет ликвидирована при возврате из функции fn( ) ; исходный же объект Chester ликвидируется при выходе из main( ).
Копирующий конструктор выглядит как обычный, но обладает особенностью получать в качестве аргумента ссылку на другой объект того же класса. ( Обратите внимание, что использованный в примере копирующий конструктор, помимо простого копирования объекта, делает кое-что ещё, например выводит строку "Конструируем копию...". Эту возможность выполнять кроме собственно копирования и другие действия можно будет с успехом применить для решения разных задач. Конечно, копирующие конструкторы обычно ограничиваются созданием копий уже существующих объектов, но на самом деле они могут делать всё, что угодно программисту. )
►Автоматический конструктор копирования...215
Копирующий конструктор так же важен, как и конструктор по умолчанию. Важен настолько, что С++ считает невозможным существование класса без копирующего конструктора. Если вы не создадите свою версию такого конструктора, С++ создаст её за вас. ( Это несколько отличается от конструктора по умолчанию, который создаётся только в том случае, если в вашем классе не определено вообще никаких конструкторов. )
_________________
215 стр. Глава 18. Копирующий конструктор
«Копирующий конструктор, создаваемый С++, выполняет поэлементное копирование всех членов-данных. Ранее копирующий конструктор, создаваемый С++, выполнял побитовое копирование. Отличие между этими методами заключается в том, что при поэлементном копировании для каждого члена класса вызываются соответствующие копирующие конструкторы ( если они существуют ), тогда как при побитовом копировании конструкторы не вызывались. Разницу в результатах можно увидеть, выполнив приведённый пример.»
[Диск]
/* DefaultCopyConstructor — демонстрация вызова */
/* конструктором копирования по */
/* умолчанию конструкторов */
/* копирования членов */
#include
#include
#include
#include
using namespace std ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
Student( char *pName = "no name" )
{
strcpy( name , pName ) ;
cout << "Конструируем " << name << endl ;
}
Student( Student& s )
{
strcpy( name , "Копия " ) ;
strcat( name , s.name ) ;
cout << "Сконструирована " << name << endl ;
}
~Student( )
{
cout << "Деструкция " << name << endl ;
}
protected :
char name[ MAXNAMESIZE ] ;
} ;
class Tutor
{
public :
/* Вызов конструктора копирования Student */
Tutor( Student& s ) : student( s )
{
cout << "Конструирование объекта Tutor" << endl ;
id = 0 ;
}
protected :
_________________
216 стр. Часть 3. Введение в классы
Student student ;
int id ;
} ;
void fn( Tutor tutor )
{