¿Cuáles son todas las funciones miembro creadas por el comstackdor para una clase? ¿Eso sucede todo el tiempo?

¿Cuáles son todas las funciones miembro creadas por el comstackdor 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?

C ++ 98/03

Si son necesarios,

  1. el comstackdor generará un constructor predeterminado para usted a menos que declare un constructor propio.
  2. el comstackdor generará un constructor de copia para usted a menos que usted declare el suyo.
  3. el comstackdor generará un operador de asignación de copias para usted a menos que usted declare el suyo.
  4. el comstackdor generará un destructor para usted a menos que usted declare el suyo.

Como dijo Péter en un útil comentario, todos estos solo son generados por el comstackdor cuando se necesitan . (La diferencia es que, cuando el comstackdor no puede crearlos, eso está bien, siempre que no se usen).


C ++ 11

C ++ 11 agrega las siguientes reglas, que también son válidas para C ++ 14 (créditos para towi, consulte este comentario ) :

  • El comstackdor genera el constructor de movimiento si
    • no hay un constructor de copia declarado por el usuario, y
    • no hay un operador de asignación de copias declarado por el usuario, y
    • no hay operador de asignación de movimiento declarado por el usuario y
    • no hay un destructor declarado por el usuario,
    • no está marcado como eliminado ,
    • y todos los miembros y bases son movibles .
  • Similar para el operador de asignación de movimiento : se genera si no hay un usuario definido
    • no hay un constructor de copia declarado por el usuario, y
    • no hay un operador de asignación de copias declarado por el usuario, y
    • no hay un constructor de movimiento declarado por el usuario y
    • no hay un destructor declarado por el usuario,
    • no está marcado como eliminado ,
    • y todos los miembros y bases son movibles .

Tenga en cuenta que estas reglas son un poco más elaboradas que las reglas de C ++ 03 y tienen más sentido en la práctica.

Para una comprensión más fácil de lo que es qué de lo anterior aquí los elementos para 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 lectura adicional, si eres un principiante en C ++, considera un diseño que no requiera que implemente ninguno de los últimos cinco, también conocido como The Rule Of Zero (por Martinho Fernandes ) .

¿Quiere decir ‘definido’ por ‘creado’?

$ 12.1 – “El constructor por defecto (12.1), el constructor de copias y el operador de asignación de copias (12.8), y el destructor (12.4) son funciones especiales de miembros.

Si ‘creado’ significa ‘definido’, aquí están las partes importantes del Estándar de C ++.

– Un constructor predeterminado implícitamente declarado para una clase se define implícitamente cuando se usa para crear un objeto de su tipo de clase (1.8).

-Si una clase no tiene un destructor declarado por el usuario, un destructor se declara implícitamente. Un destructor declarado implícitamente se define implícitamente 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, uno 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.

Por defecto, si el usuario no lo implementa, el comstackdor agrega algunas funciones miembro a la clase. Esos se llaman los cuatro grandes:

  • Constructor predeterminado
  • copia constructor
  • operador de copia (asignación)
  • incinerador de basuras

Dependiendo de los tipos de miembros y de la función miembro que proporcione usted mismo, no se generarán todos.

Otras respuestas te han dicho lo que se ha creado y que el comstackdor solo puede generarlas si se usan.

Mi preocupación es si se creó para todas las clases …

¿Por qué preocupado? ¿Crees que está creando código no deseado en el ejecutable? Poco probable, pero puede verificar fácilmente con su entorno.

¿O tal vez le preocupa que no cree un constructor cuando lo desee? Nada de qué preocuparse … siempre se crean si es necesario y el usuario no lo proporciona.

… y ¿por qué es necesario el constructor predeterminado?

Porque las clases pueden tener objetos dentro de ellos con sus propios destructores que necesitan invocarse sistemáticamente. Por ejemplo, dado …

 struct X { std::string a; std::string b; }; 

… el destructor predeterminado se asegura de que se ejecuten los destructores para ayb.