1.4.2 Присваивание и инициализация.

   


Назад  |  Вперёд

Для многих типов задача управления ими сводится к построению и уничтожению связанных с ними объектов, но есть типы, для которых этого мало. Иногда необходимо управлять всеми операциями копирования. Вернемся к классу vector:

            void f ()
            {
              vector v1 ( 100 );
              vector v2 = v1;   // построение нового вектора v2,
                                // инициализируемого v1
              v1 = v2;          // v2 присваивается v1
               // ...
            }

Должна быть возможность определить интерпретацию операций инициализации v2 и присваивания v1. Например, в описании:

            class vector 
            {
                int * v;
                int sz;
            public:
                // ...
                void operator = ( const vector & );  // присваивание
                vector ( const vector & );          // инициализация
            };

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

            void vector::operator = ( const vector & a )
             // контроль размера и копирование элементов
            {
              if ( sz != a.sz ) 
                error ( "недопустимый размер вектора для =" );
              for ( int i = 0; i < sz; i++ ) v [ i ] = a.v [ i ];
            }

Поскольку эта операция использует для присваивания "старое значение" вектора, операция инициализации должна задаваться другой функцией, например, такой:

            vector::vector ( const vector & a )
            // инициализация вектора значением другого вектора
            {
              sz = a.sz;                        // размер тот же
              v = new int [ sz ];               // выделить память для массива
              for ( int i = 0; i < sz; i++ )    //копирование элементов
                  v [ i ] = a.v [ i ];
            }

В языке С++ конструктор вида T(const T&) называется конструктором копирования для типа T. Любую инициализацию объектов типа T он выполняет с помощью значения некоторого другого объекта типа T. Помимо явной инициализации конструкторы вида T(const T&) используются для передачи параметров по значению и получения возвращаемого функцией значения.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.