2010-04-03 10 views
10

Estoy estudiando C++ y no pueden entender el significado de la frase en negrita a continuación:C++, restricciones constructor

De IBM manual:

Las siguientes restricciones se aplican a los constructores y destructores:

  • Los constructores y destructores no tienen tipos de devolución ni pueden devolver valores.
  • Las referencias y los punteros no se pueden utilizar en constructores y destructores porque no se pueden tomar sus direcciones.
  • Los constructores no se pueden declarar con la palabra clave virtual.
  • Los constructores y destructores no pueden declararse estáticos, const o volátiles.
  • Los sindicatos no pueden contener objetos de clase que tengan constructores o destructores.

¿Podría darme un ejemplo? ¡Gracias!

Respuesta

24

La oración significa que no puede tomar el puntero a un constructor o un destructor. He aquí un ejemplo:

class Sample{ 
    private: int x; 
    public: Sample() { x = 100; }; 
    public: void* member() { x = 200; }; 
}; 

template <class X> 
void call_me(Sample s, X function){ 
    (s.*function)(); 
}; 

call_me(s, &Sample::member); //valid 
call_me(s, &Sample::Sample); //invalid 
call_me(s, &Sample::~Sample); //invalid 

La razón es la siguiente:

  1. constructor no devuelve nada (aunque puede ser considerada una función que devuelve un objeto inicializado). ¿Cuál sería el tipo de devolución como función miembro?
  2. Constructor no es realmente una función miembro, en el sentido de que no se puede llamar a un objeto (como s.member()).
  3. Puede haber varias funciones reales creadas para cada constructor y destructor. Un constructor puede asignar memoria, el otro puede no (pero aún inicializando miembros de clase de la misma manera). Un destructor puede destruir subobjetos base, el otro puede no. En cada invocación de ctor/dtor en el código fuente, el compilador elige el ctor/dtor de "bajo nivel" para llamar; esta elección se realiza en tiempo de compilación. No se puede hacer si lo invocas a través de un puntero.
    Probablemente esto es lo que significa "sus direcciones no pueden tomarse".
11

No se puede hacer un puntero a la función (o referencia) que apunte a un constructor.

1

La primera conjetura sería que no puede crear una referencia o un puntero a un constructor/destructor. Por supuesto, "una referencia o un puntero" en este caso (si fuera posible) tendría un tipo de referencia a miembro o de puntero a miembro, ya que estas funciones de miembro no son estáticas. Sin embargo, esta interpretación es problemática por una razón: en C++ no existe una referencia-a-miembro.

Básicamente, la mención de "referencia" dentro de esta interpretación no tiene ningún sentido: no se puede tener una referencia a cualquier función miembro no estática de una clase, independientemente de si se trata de un constructor/destructor o no. Simplemente no existe tal cosa en C++.

Si esta interpretación es correcta (como otras respuestas también sugirieron), el texto más significativo (y aún así no prefecto) sería

  • Los punteros no se puede utilizar en constructores y destructores porque sus direcciones no pueden ser tomadas .

La mención de "referencias" en este contexto no tiene ningún sentido en absoluto.

-1

ellos no pueden ser estáticos o virtual

+0

Es posible que desee dar más detalles sobre su respuesta, porque lo que dice ahora no es muy útil para cualquier principiante. –