¿Cuáles son todas las funciones miembro creadas por el compilador para una clase? ¿Eso sucede todo el tiempo? como destructor. Mi preocupación es si se creó para todas las clases, y ¿por qué es necesario el constructor predeterminado?¿Cuáles son todas las funciones miembro creadas por el compilador para una clase? ¿Eso sucede todo el tiempo?
Respuesta
C++ 98/03
Si se necesitan,
- el compilador generará un constructor por defecto para usted menos que se declare cualquier constructor de su propio.
- el compilador generará una copia constructor para usted a menos que usted declara su propia.
- el compilador generará una copia operador de asignación para usted a menos que usted declara su propia.
- el compilador generará destructor para usted a menos que usted declare el suyo.
Como dijo Pedro en un comentario servicial, todos esos son solamente generados por el compilador cuando se necesitan. (La diferencia es que, cuando el compilador no puede crearlos, eso está bien, siempre que no se usen).)
C++ 11
C++ 11 añade las siguientes reglas, que son también cierto para C++ 14 (créditos a towi, ver this comment):
- el compilador genera el movimiento constructor si
- no hay-declarado usuario copiaconstructor, y
- no hay-declarado usuario copiaoperador de asignación, y
- no hay-declarado usuario moveroperador de asignación y
- no hay declarados usuario destructor,
- es no marcado como suprimen,
- y todos los miembros y las bases son móvil.
- similar para el movimientoasignación operador: Se genera si no hay ningún usuario definido
- no hay-declarado usuario copiaconstructor, y
- no hay usuarios declarados copiaoperador de asignación, y
- no hay declarados usuario movimientoconstructor y
- no hay declarados usuario destructor,
- es no marcados como eliminado,
- y todos los miembros y bases son movible.
Tenga en cuenta que estas reglas son un poco más elaborados que los de C++ 03 reglas y tienen más sentido en la práctica.
Para una mejor comprensión de lo que es lo de lo anterior aquí los artículos de Thing
:
class Thing {
public:
Thing(); // default constructor
Thing(const Thing&); // copy c'tor
Thing& operator=(const Thing&); // copy-assign
~Thing(); // d'tor
// C++11:
Thing(Thing&&); // move c'tor
Thing& operator=(Thing&&); // move-assign
};
Y como la lectura adicional, si usted es un C++ - principiante considerar un diseño que no requiere que usted pueda poner en práctica cualquiera de los últimos cinco, también conocido como The Rule Of Zero(por Martinho Fernandes).
De forma predeterminada, si el usuario no lo implementa, el compilador agrega algunas funciones miembro a la clase. Se llaman los cuatro grandes:
- constructor por defecto
- constructor de copia
- operador de copia (asignación)
- destructor
Dependiendo de los tipos de los miembros y que funcionan miembros enumerados usted se provee a sí mismo, esos no serán todos generados.
¿Quieres decir 'defined' por 'created'?
$ 12,1 - "El constructor por defecto (12.1), constructor de copia y copiar operador de asignación (12.8), y el destructor (12.4) son funciones miembro especiales
Si 'creados' 'definido', entonces, aquí están los medios. las partes importantes de la estándar de C++.
-án declarado implícitamente-constructor predeterminado para una clase se define implícitamente cuando se utiliza para crear un objeto de su tipo de clase (1,8).
-Si una clase tiene ningún destructor declarado por el usuario, un destructor se declara implícitamente. Un destructor declarado implícitamente se define implícitamente w cuando se usa para destruir un objeto de su tipo de clase.
-Si la definición de clase no declara explícitamente un constructor de copia, se declara implícitamente. Un constructor de copia declarado implícitamente se define implícitamente si se usa para inicializar un objeto de su tipo de clase a partir de una copia de un objeto de su tipo de clase o de un tipo de clase derivado de su tipo de clase.
-Si la definición de clase no declara explícitamente un operador de asignación de copia, se declara implícitamente. Un operador de asignación de copia declarado implícitamente se define implícitamente cuando a un objeto de su tipo de clase se le asigna un valor de su tipo de clase o un valor de un tipo de clase derivado de su tipo de clase.
Otras respuestas te han dicho lo que se ha creado y que el compilador solo puede generarlas si se usan.
Mi preocupación es si se crea para todas las clases ...
Por qué preocupa?¿Crees que está creando código no deseado en el ejecutable? Poco probable, pero puede verificar fácilmente con su entorno.
O tal vez su preocupación era que no podría crear un constructor cuando se quiere uno? Nada de qué preocuparse ... siempre se crean si es necesario y el usuario no lo proporciona.
... y ¿por qué se necesita el constructor predeterminado?
Porque las clases pueden tener objetos dentro de ellas con sus propios destructores que deben invocarse sistemáticamente. Por ejemplo, dada ...
struct X
{
std::string a;
std::string b;
};
... el destructor por defecto hace que los destructores de ayb plazo.
No, los destructores de 'B' y 'a' se ejecutará automáticamente después de * * que ejecuta el vacío' destructor x'. – fredoverflow
@Fred: desde el punto de vista del código de usuario, verdadero. Pero el compilador está concatenando todo el cuerpo de destrucción X explícito (si se proporciona) con los destructores de subobjeto para formar la función de destructor real. –
- 1. Motor MATLAB versus librerías creadas por el compilador MATLAB?
- 2. Cómo definir las funciones miembro 'final' para una clase
- 3. Obtener todas las filas creadas hoy
- 4. ¿Por qué las funciones miembro de la clase sombrean funciones libres con el mismo nombre?
- 5. ¿Cuáles son las mejores prácticas para implementar el operador == para una clase en C#?
- 6. ¿Cuáles son todas las instancias de azúcar sintáctico en Scala?
- 7. ¿Cuándo debería preferir las funciones de no amigo no miembro a las funciones de miembro?
- 8. ¿Cuáles son todas las "convenciones" para Ruby on Rails?
- 9. Revertir todo el procedimiento (todas las instrucciones)
- 10. ¿Cuáles son las mejores prácticas para crear una clase de repositorio con el código EF4 primero?
- 11. ¿Cuáles son algunos consejos para optimizar el código de ensamblado generado por un compilador?
- 12. menos el compilador dobla todo
- 13. ¿Cuáles son las cinco prioridades para el desarrollo de software?
- 14. ¿Cuáles son las opciones de línea de comando para el VB6 IDE (compilador)
- 15. Impedir la creación de una clase cuyas funciones miembro sean todas estáticas
- 16. ¿Por qué las etiquetas son todas minúsculas?
- 17. ¿Puedo hacer una macro de clojure que me permita obtener una lista de todas las funciones creadas por la macro?
- 18. ¿Cuáles son las opciones disponibles para el método Doctrine_Core :: generateModelsFromDb?
- 19. ¿Cuáles son las macros predefinidas de gcc para el número de versión del compilador?
- 20. ¿Las funciones de tiempo de MSVC son seguras para subprocesos?
- 21. C++ funciones de miembro volátil
- 22. ¿Por qué sucede esto todo el tiempo? Solr OutOfMemoryError GC overhead limit excedido
- 23. ¿Cómo implementar las funciones miembro de clase estática en el archivo * .cpp?
- 24. ¿Cuáles son todas las restricciones de Apple para el desarrollo de iPhone?
- 25. ¿Debo declarar todas las funciones virtuales en una clase base?
- 26. ¿Cuáles son las funciones consideradas como python avanzado?
- 27. ¿Cuáles son todas las convenciones de nomenclatura de mónadas?
- 28. ¿Cuáles son las diferencias entre un compilador y un enlazador?
- 29. ¿Cuáles son todas las alternativas disponibles a WCF?
- 30. ¿Por qué no está sellado el tipo de clase y qué puedo hacer con eso?
En aras de la precisión, todos estos se generan sólo cuando son realmente necesarios, no siempre. P.ej. El operador de asignación se genera solo si hay una asignación real que tiene lugar en una instancia de la clase en cuestión. –
@sbi: Sí. Las reglas son un poco más complejas, por lo que entiendo para asegurarse de que las clases de estilo C++ 03 se comporten como se espera. No soy un experto en 0x pero entiendo que un constructor de movimientos no se genera si la clase tiene un constructor de copias declarado por el usuario. Puede declarar uno '= default' si desea que la implementación predeterminada vuelva a estar activada. –
@Charles: A pesar de que el impago de las operaciones de movimiento probablemente tendrá la semántica no deseados si las operaciones de copia por defecto hacer lo incorrecto y por lo tanto tuvo que ser proporcionado de forma manual. – fredoverflow