►Автоматический конструктор копирования...215

We use cookies. Read the Privacy and Cookie Policy

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

_________________

215 стр. Глава 18. Копирующий конструктор

«Копирующий конструктор, создаваемый С++, выполняет поэлементное копирование всех членов-данных. Ранее копирующий конструктор, создаваемый С++, выполнял побитовое копирование. Отличие между этими методами заключается в том, что при поэлементном копировании для каждого члена класса вызываются соответствующие копирующие конструкторы ( если они существуют ), тогда как при побитовом копировании конструкторы не вызывались. Разницу в результатах можно увидеть, выполнив приведённый пример.»

[Диск]

    /* DefaultCopyConstructor — демонстрация вызова */

    /*                    конструктором копирования по */

    /*                     умолчанию конструкторов */

    /*                     копирования членов */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    #include <strings.h>

    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 )

    {

        cout << "В функции fn( )" << endl ;

    }

    int main( int argcs , char* pArgs[ ] )

    {

        setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */

        Student Chester( "Chester" ) ;

        Tutor tutor( Chester ) ;

        cout << "Вызов fn ( )" << endl ;

        fn( tutor ) ;

        cout << "Возврат из fn( )" << endl ;

        /* Пауза для того, чтобы посмотреть на результат работы программы */

        system( "PAUSE" ) ; return 0 ;

    }

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

    Конструируем Chester

    Сконструирована Копия Chester

    Конструирование объекта Tutor

    Вызов fn( )

    Сконструирована Копия Копия Chester

    В функции fn( )

    Деструкция Копия Копия Chester

    Возврат из fn( )

    Press any key to continue . . .

    Деструкция Копия Chester

    Деструкция Chester

Конструирование объекта Chester приводит к вызову конструктора Student, который выводит первое сообщение. Конструктор объекта tutor вызывает копирующий конструктор Student для генерации собственного члена student, и приводит к выводу следующих двух строк.

Затем программа передаёт копию объекта Tutor в функцию fn( ). Поскольку класс Tutor не определяет копирующий конструктор, программа вызывает конструктор копирования по умолчанию.

Конструктор копирования по умолчанию Tutor вызывает конструкторы копирования для членов-данных. Копирующий конструктор для int просто копирует значение, но конструктор копирования Student генерирует вывод на экран строки Сконструирована Копия Копия Chester. Деструктор копии вызывается как часть возврата из функции fn( ).

Больше книг — больше знаний!

Заберите 20% скидку на все книги Литрес с нашим промокодом

ПОЛУЧИТЬ СКИДКУ