Выбрать главу

«Главное правило заключается в следующем: конструктор копирования используется при создании нового объекта, а оператор присвоения — если объект слева от символа присвоения уже существует.»

[Советы]

►Переопределение оператора присвоения...273

Следующая программа демонстрирует переопределение оператора присвоения. В программе также представлен конструктор копирования — просто для сравнения.

    //

    /* DemoAssignmentOperator — демонстрация оператора */

    /*          присвоения для пользовательского класса */

    //

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    #include <strings.h>

    using namespace std ;

    /* Name — класс для демонстрации присвоения и конструктора копирования */

    class Name

    {

      public :

        Name( char *pszN = 0 )

        {

            copyName( pszN , " " ) ;

        }

        Name( Name& s )

        {

            cout << "Вызов конструктора копирования" << endl ;

            copyName( s.pszName , " ( copy ) " ) ;

        }

        ~Name( )

        {

            deleteName( ) ;

        }

        /* Оператор присвоения */

        Name& operator=( Name& s )

        {

            cout << "Выполнение присвоения" << endl ;

_________________

273 стр. Глава 23. Оператор присвоения

            /* Удаляем выделенную память... */

            deleteName( ) ;

            /* ...перед заменой её новым блоком */

            copyName( s.pszName , " ( replaced ) " ) ;

            /* Возвращаем ссылку  на существующий объект */

            return *this ;

        }

        /* Очень простая функция доступа */

        char* out( ) { return pszName ; }

      protected :

        void copyName( char* pszN , char* pszAdd ) ;

        void deleteName( ) ;

        char *pszName ;

    } ;

    /* copyName( ) — Выделение памяти из кучи и сохранение строк в ней */

    void Name::copyName( char* pszN , char* pszAdd )

    {

        pszName = 0 ;

        if ( pszN )

        {

            pszName = new char[ strlen( pszN ) +

                               strlen( pszAdd ) + 1 ] ;

            strcpy( pszName , pszN ) ;

            strcat( pszName , pszAdd ) ;

        }

    }

    /* deleteName( ) — возврат памяти в куче */

    void Name::deleteName( )

    {

        if ( pszName )

        {

            delete pszName ;

            pszName = 0 ;

        }

    }

    int main( int nNumberofArgs , char* pszArgs[ ] )

    {

      setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */

        /* Создание двух объектов */

        Name n1( "Claudette" ) ;

        Name n2( "Greg" ) ;

        cout << "n1 ( " << n1.out( ) << " ) и "

             <<"n2 ( " << n2.out( ) << " ) — "

             << "вновь созданные объекты"

             << endl ;

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

        cout << "Name n3( n1 ) ;" << endl ;

        Name n3( n1 ) ;

        cout << "n3 ( " << n3.out( ) << " ) — копия n1" << endl ;

_________________