5

Conozco la regla general de C++ cuando agrega cctor, dtor u op = a su clase, necesita agregar los otros dos también para que su clase funcione correctamente en todas las circunstancias.Copiar constructor, destructor y operador de asignación. ¿Cuándo no los necesitamos a todos?

¿Hay algún caso cuando no necesita proporcionar los tres, solo uno o dos de ellos?

¿Por qué el C++ no requiere que se agreguen todos si agrega uno de ellos a su clase?

EDIT1:

Usted ha mencionado ejemplos cuando no sólo no es necesario que algunos de ellos, pero no quieren tener ellos por lo que quieren que sean privadas o protegidas. Pero aún necesita escribirlos en su código incluso con cuerpos vacíos.

La única razón válida para no tenerlas todas cuando haces una clase polimórfica al agregar un destructor virtual con el cuerpo vacío. Pero tan pronto como escriba algo en el cuerpo del destructor, debería considerar escribir algo en el cuerpo del cctor y op = también.

Estoy buscando ejemplos cuando no necesita escribir los 3 métodos y puede omitir algunos de ellos sin causar errores en su clase, incluso si un novato está utilizando su clase. :)

Respuesta

3

Las clases observadas (aquellas que informan sus vidas a otra clase) requieren todos los constructores y destructor, pero no op =. C++ no los requiere porque sería completamente innecesario, nosotros, los programadores, sabemos mejor.

Además, es posible que desee destructor pero no los otros dos si tiene una clase no copiable.

+0

+1 por mencionar tipos no copiables. –

+0

Si realmente desea que un tipo no se pueda copiar, es posible que desee escribir el cctor y op = como privado o protegido. – Calmarius

5

Un caso en el que puede querer usar un destructor sin un constructor de copia u operador de asignación es cuando desarrolla una clase polimórfica, en cuyo caso desea que un destructor virtual permita la desasignación mediante un puntero de clase base. Estas clases suelen ser compatibles con los constructores de copia para facilitar la expresión idiomática "virtual clone". Sin embargo, rara vez tienen operadores de asignación, ya que las clases polimórficas generalmente se asignan al montón y se referencian solo a través de punteros, en cuyo caso la asignación directa casi siempre conduce al corte.

+1

Yo agregaría que para proteger de rebanar, será mejor que proteja el constructor de copias. –

+0

Para las clases polimórficas, es posible que desee hacer que op = privado o protegido también. – Calmarius

1

Tienes que escribirlos todos si tienes punteros o algo así en tu clase, por lo que no habrá una copia poco clara en el editor o op =, y no habrá pérdida de memoria en dtor.

Este es un caso donde debe escribirlos todos, existen otros casos en otras respuestas.

C++ no los requiere todos porque escribe los predeterminados, y porque pueden no ser neseccary.

+0

La pregunta fue para demostrar casos en los que no son necesarios. –

1

Generalmente, cuando desee cambiar los derechos de acceso, o en el caso de el destructor, hágalo virtual. Declarar un constructor de copia privada u operador de asignación es una forma clásica de prohibir estas operaciones, , incluso si no necesita un destructor; cada vez que desee derivar de una clase, el destructor debe ser virtual (o estar protegido); y si desea prohibir cualquier cosa que no sean las instancias asignadas dinámicamente, la expresión clásica es declarar el destructor como privado, e implementar una función de destrucción que hace delete this para deshacerse del objeto.

Finalmente, las versiones generadas por el compilador están en línea, y es posible que desee para declarar una de estas funciones para evitar que esté en línea. (En días de memoria más pequeña, esto a menudo era una consideración.)

Cuestiones relacionadas