Использование конструктора копирования ...214

We use cookies. Read the Privacy and Cookie Policy

Лучший путь понять, как работает конструктор копирования, — это увидеть его в действии. Рассмотрим приведённый ниже пример с классом 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( ).

Копирующий конструктор выглядит как обычный, но обладает особенностью получать в качестве аргумента ссылку на другой объект того же класса. ( Обратите внимание, что использованный в примере копирующий конструктор, помимо простого копирования объекта, делает кое-что ещё, например выводит строку "Конструируем копию...". Эту возможность выполнять кроме собственно копирования и другие действия можно будет с успехом применить для решения разных задач. Конечно, копирующие конструкторы обычно ограничиваются созданием копий уже существующих объектов, но на самом деле они могут делать всё, что угодно программисту. )