    class TAnyClass { 
    private:  
       int i; 
       double r; 
    public: 
     TAnyClass() 
          {i = 0;   r = 0;   } 
     TAnyClass(int 11, double rr) 
            { i = 11;   r = rr;   } 
     }; 

    На практике классу TAnyClass необходимы и другие функции-члены для доступа 
к его закрытым данным-членам i и г, однако пример иллюстрирует, как работает 
копирование объектов. В классе объявлены два встраиваемых конструктора: 
конструктор по умолчанию TAnyClassO, инициализирующий члены i и г нулевыми 
значениями, и альтернативный конструктор, инициализирующий объект класса 
явными значениями. Можно объявить объекты v1 и v2 класса TAnyClass 
следующим образом: 

    TAnyClass v1; 
    TAnyClass v2(100, 3.14159); 

    Можно также использовать существующие объекты, подобные v2, для 
инициализации нового объекта v3: 

    TAnyClass v3 = v2; 

    Это приведет к копированию объекта v2 в v3 с почленной инициализацией 
данных-членов объекта v3. Другими словами, данные-члены объекта класса v2 
копируются один к одному в члены v3, что равнозначно следующей записи: 

    TAnyClass v3; 
    v3.i = v2 i, // Исключительно для демонстрации 
    v3.r = v2.r; // 


    ЗАМЕЧАНИЕ

    Второй и третий операторы в предыдущем примере приведены исключительно длля
иллючтраации. Поскольку данные-члены класса закрыты, эти операторы не 
скомпилируются. 
    Почленная инициализация нового класса выполняется также и тогда, когда вы 
передаете объект функции по значению и когда функция возвращает объект класса. 
Если любая из этих операций приводит к дублированию указателей, могут возникнуть 
серьезные ошибки. В следующем разделе поясняется, как избежать подобных ошибок.

     Конструктор копии

    Вы можете снабдить ваше приложение конструктором копии для создания 
объектов, копирующихся из других объектов. Конструктор может выполнять любые 
действия, необходимые для создания безопасной копии, в частности, не 
дублировать указатели. (В случае необходимости Borland C++ создает 
конструкторы копии для классов, в которых они непосредственно не определяются.) 
    Конструктор копии следует объявлять как CLASS( const CLASS& ). Как и все 
конструкторы, конструктор кипии не может быть виртуальным и наследоваться 
производным классом. Вот новая версия класса TAnyClass с членами-указателями 
на данные и конструктором копии: 

    #include <string.h> 
    class TAnyClass { 
    private: 
        int i;        // Закрытый член класса 	
       double г;   // Закрытый член класса 
       char *s,     // Закрытый член-указатель
    public:
       TAnyClass() 
          { 1 = 0;   г = 0;  s = NULL,   } 
       TAnyClass(int ii, double rr, const char *ss) 
          { i = 11;   r = rr;  s = strdup(ss);   } 
       ~TAnyClass() { delete s;  }                                              
       const char *GetStr(void) { return s;  } 
       TAnyClass(TAnyClass &copy),  // Конструктор копии 

    Конструктор копии TAnyClass(TAnyClass &copy) имеет одинаковое имя с классом 
(TAnyClass), в котором он определен, в нем объявлена ссылка &сору на объект класса 
TAnyClass, данные из которого копируются в создаваемый объект. Реализуйте 
конструктор копии где-либо в другом месте программы (либо встраиваемым в 
объявлении класса): 

    Глава 15. Передовые средства C++     383 
