2013-10-27 2 views
-1

ОК, я читаю «эффективный C++», а пункт 12 говорит, пожалуйста, не вызывайте назначение копии в конструкторе копирования. Но после того, как я попытаюсь это сделать, он работает. Поэтому я хочу спросить, почему, я не могу повторно использовать код назначения копии в конструкторе копирования?C++: вызов копирования в конструкторе копирования

+1

Я думаю, что это потому, что, вероятно, более эффективная инициализация членов путем их непосредственного копирования в списке инициализаторов. –

+6

У меня такое чувство, которое хорошо объяснено в пункте 12 «Эффективный C++». – juanchopanza

+1

Надеюсь, что все ответы будут объяснять более или менее то же самое, что объяснил Скотт там в _Item 12_ – P0W

ответ

0

Предположим, что вы используете оператор присваивания копий в copy-constructor. Тогда вы теряете способность осуществлять copy-and-swap идиомы для оператора присваивания:

struct A 
{ 
    A (const A &a) 
    { 
    *this = a; // Assignment to a not yet constructed object is not well 
    } 

    A &operator=(A a) // Pass by value 
    { 
     // ... 
    } 
}; 

A a1, a2; 
a1 = a2; // Infinite recursion! 

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

+1

Спасибо, я думаю, что это полезно. Это приведет к бесконечной рекурсии, если аргумент передается по значению, и нецелесообразно назначать не сконструированный объект. Извините, у меня недостаточно репутации для голосования. – lingjieyu

0

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

Смежные вопросы