Operador de asignación de llamada en el constructor de copia

¿Hay algunas desventajas de tal implementación de copy-constructor?

Foo::Foo(const Foo& i_foo) { *this = i_foo; } 

Según recuerdo, se me recomendó en un libro llamar al constructor de copias del operador de asignación y usar un conocido truco de intercambio, pero no recuerdo, por qué …

Sí, esa es una mala idea. Todas las variables miembro de los tipos definidos por el usuario se inicializarán primero y luego se sobrescribirán inmediatamente.

Ese truco de intercambio es este:

 Foo& operator=(Foo rhs) // note the copying { rhs.swap(*this); //swap our internals with the copy of rhs return *this; } // rhs, now containing our old internals, will be deleted 

Existen inconvenientes potenciales y ganancias potenciales al llamar al operator=() en su constructor.

Inconvenientes:

  • Su constructor inicializará todas las variables miembro, ya sea que especifique valores o no, y luego operator= los inicializará nuevamente. Esto aumenta la complejidad de la ejecución. Tendrá que tomar decisiones inteligentes sobre cuándo esto creará un comportamiento inaceptable en su código.

  • Tu constructor y operator= se unen estrechamente. Todo lo que debe hacer al crear instancias de su objeto también se realizará al copiar su objeto. Nuevamente, debe ser inteligente para determinar si esto es un problema.

Ganancias:

  • La base de código se vuelve menos compleja y más fácil de mantener. Una vez más, sé inteligente al evaluar esta ganancia. Si tiene una estructura con 2 miembros de cadena, probablemente no valga la pena. Por otro lado, si tienes una clase con 50 miembros de datos (probablemente no deberías, pero eso es una historia para otra publicación) o miembros de datos que tienen una relación compleja entre sí, podría haber una gran cantidad de beneficios al tener solo uno función init en lugar de dos o más.

Está buscando el artículo 12 efectivo de Scott Meyers, C ++ : copie todas las partes de un objeto.