Pregunta

Por ejemplo, ¿es así:

class C 
{
   private: 
     C();
     C(const & C other);
}

o bien debe proporcionar la definición (s):

class C 
{
   private: 
     C() {};
     C(const & C other) {};
}

? Gracias por las respuestas actuales. Vamos a ampliar esta pregunta - sí genera compilador mejor código en una de sus ejemplos? Me puedo imaginar que la provisión de cuerpo para las fuerzas ctor compilador para incluir algún código (vacío) en la unidad de compilación? Es esto también es cierto para el código generado automáticamente?

¿Fue útil?

Solución

Si no desea que su objeto sea copiable, entonces no hay necesidad de proporcionar a la aplicación. Sólo declarar la copia privada ctor sin ninguna aplicación. Lo mismo vale para otras ctors, si no desea ningún cuerpo para usarlos, simplemente declararlos privada sin ningún tipo de aplicación.

Otros consejos

Es bien siempre y cuando no se utilicen.

Con el estándar 0x puede utilizar funciones eliminados .

class X {
   // ...
   X& operator=(const X&) = delete; // Disallow copying
   X(const X&) = delete;
};

Es posible utilizar constructores de declaración sólo para no permitir construcciones dadas, como construcción estándar, o copia de la construcción.

Por ejemplo, si se quiere evitar el objeto que está siendo copiado se puede declarar como privados del constructor de copia y el operador de asignación y no definirlos, entonces cualquier persona, incluido usted, que trata de copiar el objeto tendrá errores de enlace .

Acerca de su última edición: Yo esperaría un compilador decente para producir el mismo código para un constructor por defecto y por un constructor vacío y no hay lista de inicialización, al final, lo que tiene que hacer es default-inicializar cada miembro.

Si se declaran sin proporcionar aplicación, entonces no se pueden utilizar debido a que no existen. Si desea utilizar los constructores, debe permitir que sea el compilador para crear ellos al no declarar, o debe declarar ellos y proporcionar una implementación.

A veces es útil para proporcionar una declaración pero sin la aplicación de un constructor que no desee utilizar. Esto se hace a menudo con el constructor de copia para los objetos (como únicos) que no quiere que haya copias de, nunca. En tales casos, la declaración se hace a menudo privado.

En primer lugar, si usted desea hacer su clase completamente no copiable, no implementar el constructor de copia y asignación operador privado. De lo contrario, todavía es posible que un trozo de código que tiene acceso (un método o un amigo) en silencio puede hacer copias. Sin la aplicación, obtendrá un error de vinculador.

Sin embargo, un error del compilador sería preferible, ya que encontrará a cabo sobre el error más rápido. Para ello hay boost::noncopyable, o se puede derivar de una clase base que los cueros su constructor de copia y asignación del operador.

En cuanto al constructor por defecto: el compilador no generará uno si se declara ningún constructor en absoluto. Generalmente no hay necesidad de ocultar que específicamente.

Si utiliza la declaración de 'vacío', el compilador no generará la implementación predeterminada y obtendrá errores de enlace. Si se declaran, hay que escribirlas por lo que la forma vacía-Brace es necesario.

Usted tendrá que proporcionar definiciones. Si no lo hace, y se intenta utilizarlos, no será capaz de enlazar.

Eso depende de si se utiliza o no estos constructores. Si no se utilicen puede dejarlos sin definir. Si los usa (por ejemplo, va a crear objetos de la clase de funciones estáticas de la clase, es necesario definirlos) que necesita para proporcionar definiciones, de lo contrario obtendrá sin resolver error de símbolos externos del enlazador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top