Читаем С++ для "чайников" . полностью

Оператор присвоения очень похож на конструктор копирования, а при использовании они практически идентичны.

    void fn( MyClass&mc )

    {

        MyClass newMC( mc ) ; /* Здесь используется конструктор копирования */

        MyClass newerMC = mc ; /* Менее очевидно, что здесь также используется конструктор копирования */

        MyClass newestMC ; /* Создание объекта по умолчанию */

        newestMC = mc ; /* Присвоение */

    }

_________________

272 стр. Часть 5. Полезные особенности

Создание newMC следует стандартному шаблону создания нового объекта как зеркального отображения существующего с использованием копирующего конструктора MyClass( MyClass& ). Несколько менее очевидно, что объект newerMC также создаётся при помощи конструктора копирования. Запись MyClass а = b — всего лишь другой способ записи MyClass a( b ). То, что в первом варианте записи имеется символ "=", не приводит к вызову оператора присвоения. Однако в случае с объектом newestMC всё не совсем так. Сначала этот объект создаётся с использованием конструктора по умолчанию, а затем перезаписывается объектом mc с помощью оператора присвоения.

Подобно конструктору копирования, оператор присвоения должен быть переопределён, если мелкое копирование приводит к некорректным результатам ( см. материал, представленный в главе 18, "Копирующий конструктор" ). Простейшее правило: если у класса есть пользовательский конструктор копирования, то переопределите для него и оператор присвоения.

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

[Советы]

<p id="chapter23.4"><strong>►Переопределение оператора присвоения...273</strong></p>

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

    //

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

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

    //

    #include

    #include

    #include

    #include

    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 ;

        }

    }

Перейти на страницу:

Все книги серии Для чайников

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных