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


¿Cuáles son todas las funciones miembro creadas por el compilador para una clase? ¿Eso pasa todo el tiempo? como destructor. Mi preocupación es si se crea para todas las clases, y por qué se necesita constructor predeterminado?

Author: sbi, 2010-09-17

4 answers

C++98/03

Si son necesarios,

  1. el compilador generará un constructor predeterminado para usted a menos que declare cualquier constructor propio.
  2. el compilador generará un copia constructor para usted, a menos que declare su propia.
  3. el compilador generará un copia operador de asignación para usted, a menos que declare su propia.
  4. el compilador generará un destructor para usted a menos que usted declare su propio.

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


C++11

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

  • El compilador genera el mover constructor si
    • no hay ningún usuario-declaró copia constructor, y
    • no hay ningún usuario-declaró copia operador de asignación, y
    • no hay ningún usuario-declaró mover operador de asignación y
    • no hay un destructor declarado por el usuario ,
    • es no marcado como elimina,
    • y todos los miembros y bases son móviles.
  • Similar para el mover operador de asignación: se genera si no es definido por el usuario
    • no hay ningún usuario-declaró copia constructor, y
    • no hay ningún usuario-declaró copia operador de asignación, y
    • no hay ningún usuario-declaró mover constructor y
    • no hay user-declared destructor ,
    • es no marcado como elimina,
    • y todos los miembros y bases son móviles.

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 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 usted es un principiante en C++considere un diseño que no requerir la implementación de cualquiera de los últimos cinco años, un.k.un La Regla De Cero (por Martinho Fernandes).

 76
Author: sbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 04:44:37

¿Quieres decir 'definido' por 'creado'?

} 12.1 - "El constructor predeterminado (12.1), el constructor de copia y el operador de asignación de copia (12.8), y el destructor (12.4) son funciones miembro especiales.

Si 'creado' significa 'definido' entonces, aquí están las partes importantes del estándar C++.

-Un constructor predeterminado declarado implícitamente 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 ninguna declaración de usuario destructor, 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 la clase no declara explícitamente un constructor de copia, uno 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.

 2
Author: Chubsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-17 10:00:01

Por defecto, si no es implementado por el usuario, el compilador añade algunas funciones miembro a la clase. Esos son llamados los cuatro grandes :

  • constructor predeterminado
  • copy constructor
  • operador de copia (asignación)
  • destructor

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

 1
Author: Klaim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-16 19:06:23

Otras respuestas le 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é preocuparse? Pensando que está creando código no deseado en el ejecutable? Poco probable, pero se puede comprobar con bastante facilidad con su entorno.

O tal vez su preocupación era que podría no crear un constructor cuando lo desea? Nada de qué preocuparse... siempre se crean si es necesario y no proporcionada por el usuario.

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

Porque las clases pueden tener objetos dentro de ellas con sus propios destructores que necesitan ser invocados sistemáticamente. Por ejemplo, dado...

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

...el destructor predeterminado se asegura de que los destructores de a y b se ejecuten.

 0
Author: Tony Delroy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-17 10:05:21