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

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

    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 ;

        }

    }

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

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

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

Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных
Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript

Данная книга посвящена программированию игр с помощью ActionScript. Здесь вы найдете подробные указания, необходимые для создания самых разных игр – аркад, головоломок, загадок и даже игровых автоматов. В тексте приведены исходные коды программ и детальные, доступно изложенные инструкции. Базовые принципы программирования ActionScript рассматриваются на примере игр, однако вы без труда сможете применить полученные знания и для разработки неигровых проектов, таких как Web-дизайн и реклама. Рекомендации Гэри Розенцвейга помогут вам не только придумывать занимательные игры и размещать их на Web-сайте, но и оптимизировать скорость их работы, а также защищать свои творения от несанкционированного копирования. Представленный в книге код несложно изменить для использования в других программах.Книга предназначена для широкого круга читателей – создателей анимационных роликов, художников-оформителей, программистов и разработчиков Web-сайтов. Издание может также выступать в качестве практического пособия по изучению ActionScript.

Гэри Розенцвейг

Программирование, программы, базы данных / Программирование / Книги по IT
Язык программирования Euphoria. Справочное руководство
Язык программирования Euphoria. Справочное руководство

Euphoria (юфо'ри, также рус. эйфори'я, ра'дость) — язык программирования, созданный Робертом Крейгом (Rapid Deployment Software) в Канаде, Торонто. Название Euphoria — это акроним для «End-User Programming with Hierarchical Objects for Robust Interpreted Applications».Euphoria — интерпретируемый императивный язык высокого уровня общего назначения. C помощью транслятора из исходного кода на Euphoria может быть сгенерирован исходный код на языке Си, который в свою очередь может быть скомпилирован в исполнияемый файл или динамическую библиотеку при помощи таких компиляторов, как GCC, OpenWatcom и др. Программа Euphoria также может быть «связана» с интерпретатором для получения самостоятельного исполняемого файла. Поддерживается несколько GUI-библиотек, включая Win32lib и оберток для wxWidgets, GTK+ и IUP. Euphoria имеет встроенную простую систему баз данных и обертки для работы с другими типам баз данных.[Материал из Википедии]

Коллектив авторов

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