sirven que punteros puntero para new los lenguaje funcion declaracion cadenas aritmetica c++ oop initialization-list

que - punteros c++ pdf



C++: ¿Inicializar un puntero de miembro a nulo? (7)

Tengo una clase que se parece a:

class Foo { public: Foo(); virtual ~Foo(); private: Odp* bar; };

Deseo inicializar la bar a NULL . ¿Es esta la mejor manera de hacerlo?

Foo::Foo() : bar(NULL) { }

Además, ¿es necesario que el destructor sea virtual? (Si eso es cierto, entonces ¿el constructor también debe ser virtual?)


Deseo inicializar la bar a NULL . ¿Es esta la mejor manera de hacerlo?

Es la forma correcta . Entonces sí.

Además, ¿es necesario que el destructor sea virtual?

No. El destructor solo necesita ser virtual si va a heredar de la clase Foo y usará un puntero Foo para eliminar esas clases derivadas (aunque como regla general general, debería ser virtual si hay otros miembros virtuales). ).

(Si eso es cierto, entonces ¿el constructor también debe ser virtual?)

No. Los constructores no necesitan ser virtual , ni tampoco pueden .



  1. Sí, la lista de inicializadores es la mejor.

  2. Tal vez. El destructor debe ser virtual si pretendes tener otras funciones virtuales en la clase, o si pretendes heredar la clase (aunque generalmente esas cosas van juntas).

  3. No. No es posible tener un constructor virtual en C ++. (¿Qué significaría tal cosa?)

La naturaleza de su pregunta me sugiere que realmente no entiende lo que hace la palabra clave virtual , o para qué sirve, y está copiando algo que vio en otro lugar o en un tutorial. Es mejor entender el propósito de todo el código que estás escribiendo. Este podría ser un lugar para comenzar: http://www.parashift.com/c++-faq-lite/virtual-functions.html


1 si

2, solo si desea que alguien pueda derivar de su clase y use un puntero a la clase base, pero de todos modos haga que el dtor sea virtual

3, no, no puedes tener un ctor virtual (¿o todos los ctors son virtuales, supongo?)


Existen cuatro formas distintas. Cuál es el mejor depende de usted

Foo::Foo() : bar() // value initialization { } Foo::Foo() : bar(0) // direct null pointer constant { } Foo::Foo() : bar(NULL) // null pointer constant by macro { } Foo::Foo() : bar(nullptr) // pointer literal of type std::nullptr_t { }


Las funciones virtuales son para determinar qué función de la clase (que se define tanto en la clase base como en la clase derivada) debe llamarse durante el tiempo de ejecución. Pero cuando se crea el objeto, el compilador sabe a qué constructor se va a llamar. por ej. cuando se crea el objeto base, se llama al constructor base y lo mismo para la clase derivada. Por lo tanto, hacer que el constructor sea virtual no tiene ningún sentido. Pero una vez que el puntero del objeto de la clase base apunta al objeto de la clase derivada, y luego se llama al destructor, el compilador se confunde a qué destructor (ya sea de base o derivado) se debe llamar, que es solo se puede resolver usando la tabla de búsqueda vtable y, por lo tanto, el destructor debe ser virtual.


Otra opción que quizás desee considerar es usar una clase de puntero inteligente (como boost::scoped_ptr , boost::shared_ptr o boost::shared_ptr C ++ 0x) en lugar de un puntero sin unique_ptr . El constructor del puntero inteligente se asegurará de que se inicialice a algo como NULL si no necesita otra inicialización explícita. El puntero inteligente también garantizará que el objeto apuntado se destruya.

Solo necesita decidir qué tipo de política de punto inteligente es la adecuada para el elemento y elegirlo en consecuencia (incluso auto_ptr podría ser mejor que un puntero sin formato, siempre que sepa de los diversos riesgos).