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

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

►"Мелкие" и "глубокие" копии 217

►Временные объекты 221

Конструктор — это специальная функция, которая автоматически вызывается С++ при создании объекта с тем, чтобы предоставить ему возможность проинициализировать самого себя. В главе 16, "Создание и удаление объектов", описаны основные концепции применения конструкторов, в главе 17, "Аргументация конструирования", вы познакомились с разными типами конструкторов. А в настоящей главе рассматривается частный случай, известный под названием копирующего конструктора ( или конструктора копирования ).

<p id="chapter18.1"><strong>►Копирование объекта...213</strong></p>

Конструктор, который используется С++ для создания копий объекта, называется копирующим конструктором, или конструктором копирования. Он имеет вид X::Х( Х& ) ( или X::X( const Х& ) ), где X — имя класса. Да, это не ошибка — это действительно конструктор класса X, который требует в качестве аргумента ссылку на объект класса X. Это звучит несколько бессмысленно, но не торопитесь с выводами и позвольте объяснить, зачем такое "чудо" в С++. 

<p id="chapter18.1.1"><strong><emphasis>Зачем нужен копирующий конструктор...213</emphasis></strong></p>

Подумайте о том, что будет происходить в программе, если вы вызовете следующую функцию:

    void fn( Student fs )

    {

        /* Некоторые действия */

    }

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

    {

        Student ms ;

        fn( ms ) ;

        return 0 ;

    }

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

_________________

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

«В С++ аргументы функции передаются по значению.»

[Помни!]

Теперь попробуем понять, что же значит — создать копию объекта. Для этого требуется конструктор, который будет создавать объект ( даже если копируется уже существующий объект ). С++ мог бы побайтово скопировать существующий объект в новый, но как быть, если побайтовая копия не совсем то, что нам нужно? Что, если мы хотим нечто иное? ( Не спрашивайте у меня пока, что такое это "иное" и зачем оно нужно. Немного терпения! ) У нас должна быть возможность самим определять, как будет создаваться копия объекта.

Таким образом, в приведённом выше примере необходим копирующий конструктор, который будет выполнять копирование объекта ms при вызове функции fn( ). Этот частный копирующий конструктор и есть Student::Student( students ) ( попробуйте-ка произнести эту скороговорку... ).

<p id="chapter18.1.2"><strong><emphasis>Использование конструктора копирования ...214 </emphasis></strong></p>

Лучший путь понять, как работает конструктор копирования, — это увидеть его в действии. Рассмотрим приведённый ниже пример с классом Student.

    //

    /* CopyConstructor — работа конструктора копирования */

    //

    #include

    #include

    #include

    #include

    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 ;

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

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

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

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

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

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

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

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

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

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