2010-09-17 7 views

Respuesta

68

C++ 98/03

Si se necesitan,

  1. el compilador generará un constructor por defecto para usted menos que se declare cualquier constructor de su propio.
  2. el compilador generará una copia constructor para usted a menos que usted declara su propia.
  3. el compilador generará una copia operador de asignación para usted a menos que usted declara su propia.
  4. 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).

+6

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. –

+0

@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. –

+0

@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

1

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.

2

¿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.

0

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.

+0

No, los destructores de 'B' y 'a' se ejecutará automáticamente después de * * que ejecuta el vacío' destructor x'. – fredoverflow

+0

@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. –

Cuestiones relacionadas