As we know, si se declara cualquier constructor (copia constructor incluido), el constructor predeterminado (el que no toma argumentos) no se crea implícitamente. ¿Ocurre lo mismo con un constructor de copia predeterminado (el que realiza una copia superficial de un objeto)? Además, ¿la presencia de destructor afecta esto de todos modos?C++: ¿el constructor de copia predeterminado está afectado por la presencia de otros constructores y destructor?
Respuesta
Las respuestas aquí son correctas pero no completas. Son correctos para C++ 98 y C++ 03. En C++ 11 no obtendrá un constructor de copia si ha declarado un constructor de movimiento o un operador de asignación de movimiento. Además, si ha declarado un operador de asignación de copia o un destructor, la generación implícita del constructor de copia queda obsoleta. 12.8 [class.copy]:
Si la definición de clase no declarar explícitamente un constructor de copia, no hay declarados de movimiento de usuarios constructor, y no hay -declarada de usuario operador de asignación movimiento , un constructor de copia es declarado implícitamente como predeterminado (8.4.2). Dicha declaración implícita está en desuso si la clase tiene un operador de asignación de copias declarado por el usuario o un destructor declarado por el usuario.
No. Obtendrá un constructor de copia predeterminado a menos que proporcione su propio constructor de copia, y la presencia o ausencia de un destructor no hace ninguna diferencia.
El constructor de copia predeterminado siempre se crea, a menos que defina el suyo propio. El constructor sin argumentos no se define con ningún otro constructor presente para evitar llamarlo y, por lo tanto, omitir el código del constructor real.
Gracias por explicar el motivo de este comportamiento) – Septagram
No. Y cuenta que
MyClass
{
template <typename T> MyClass(const T&);
};
no proporciona un constructor de copia, y se genera un defecto. objetos
¿Por qué no? Incluso si no solo está declarado, ¿pero también está definido? Incluso si hay una especialización (plantilla <> MyClass :: MyClass
@Septagram: no. Las especializaciones no cambian el trato, y no se toman en cuenta para la resolución de sobrecarga. El constructor de copia ** debe ** ser una función no plantilla, punto. –
Eso es extraño. Pero está bien, gracias :) – Septagram
12.8 # 4 clase copia
Si la definición de clase no declarar explícitamente un constructor de copia, uno se declara implícitamente
Y el destructor no desempeña ningún papel
Puntos de bonificación por cotización) – Septagram
- 1. Por qué el compilador proporciona el constructor de copia predeterminado
- 2. vectores dentro de las clases: el manejo de constructor de copia y el destructor (C++)
- 3. C++ constructor de copia, los temporales y la semántica copia
- 4. C++: devolver por referencia y copiar constructores
- 5. ¿Están el constructor y el destructor predeterminados siempre en línea?
- 6. Por qué deshabilitar la asignación y el constructor de copia de CObject
- 7. Constructor y destructor de objetos de Excel VBA
- 8. Copy Constructor y constructor predeterminado
- 9. const en constructor de copia en C++
- 10. subclase de QObject, qRegisterMetaType, y el constructor de copia privada
- 11. cuánto hace el destructor predeterminado
- 12. constructores piden otros constructores en vb.net a la C#
- 13. ¿Por qué el constructor de copia implícita llama al constructor de copia de la clase base y el constructor de copia definido no?
- 14. Herencia jerarquía: constructor y destructor secuencia de ejecución
- 15. Copiar constructores - C++
- 16. ¿Por qué se llama este constructor de copia en lugar de mover el constructor?
- 17. C++: ¿La reasignación automática de vectores invoca constructores de copia? ¿Por qué?
- 18. especificación de excepción de gcc destructor predeterminado
- 19. Cómo manejar el constructor predeterminado requerido
- 20. RVO/NRVO y el constructor público de copia no definida
- 21. std :: vector :: clear() en constructor y destructor
- 22. Conflicto entre el constructor de copia y el constructor de reenvío
- 23. ¿Es posible "agregar" al constructor de copia predeterminado?
- 24. ¿Cómo declarar el constructor de copia en la clase derivada, sin construcor predeterminado en la base?
- 25. ¿Por qué el constructor de copias oculta el constructor predeterminado en C++?
- 26. ¿Por qué los constructores de copia no están "encadenados" como constructores o destructores predeterminados?
- 27. constructor o constructor de copia?
- 28. ¿Bajo qué circunstancias debo proporcionar, operador de asignación, constructor de copia y destructor para mi clase de C++?
- 29. Constructor de copia base no llamado
- 30. Diseño por contratos y constructores
¿Por qué estaban obsoletos? Mi destructor es virtual, pero está vacío. ¿Realmente me veo obligado a forzar la generación de constructores de copia? ¿Supongo que puedo usar 'default'? –
@JanusTroelsen: Tengo una explicación en esta respuesta: http://stackoverflow.com/a/11255258/576911 Y sí, puedes usar '= default'. –