Pregunta

Leí un libro S. Lippman "Modelo de objeto C ++", ¿hay dicho código?

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

y dice que "un constructor predeterminado no se sintetiza para este fragmento de código.

Se garantiza que los objetos globales tengan su memoria asociada "a cero" en el inicio del programa. Los objetos locales asignados en la pila de programa y los objetos de montón asignados en la tienda libre no tienen su memoria asociada a cero; Más bien, la memoria conserva el patrón de bits arbitrario de su uso anterior ".

En este código, el objeto BAZ se creó en el montón, y de acuerdo con lo que se ha dicho anteriormente, este objeto no es global y no se llamará el constructor predeterminado. ¿Entiendo correctamente?

¿Fue útil?

Solución

Las paréntesis en new Foo() especificar Inicialización de valor; Esto básicamente significa que cada miembro está inicializado por cero. Si, en cambio, dijiste new Foo, entonces los miembros se dejarían sin inicializar, como lo son para su variable automática.

Desafortunadamente, para iniciar el valor la variable automática, no puede escribir Foo bar(), ya que eso declara una función. Necesitarás

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++

Otros consejos

Cuando haces esto:

Foo* baz = new Foo();

Estás asignando dinámicamente un Foo instancia y Inicialización de valor eso. Para las cápsulas, esto significa que los miembros se inicializan cero. Si hubiera dicho esto (suponiendo un contexto no global):

Foo* baz = new Foo;

entonces el Foo La instancia se inicializaría por defecto, lo que significaría que no se realiza una inicialización de sus miembros, ya que son POD.

Esto también se aplica a instancias de almacenamiento automático:

Foo f0; // default initializaiton: members not zeroed out.
Foo f1 = Foo(); // value initialization: members zeroed out.
Foo f2{}; // C++11 value initialization: members zeroed out.
Foo f3(); // Ooops! Function declaration. Something completely different.

Si una clase no tiene un constructor predeterminado (y ningún otro constructor), el compilador creará uno para usted. Tiene que, o no podría crear instancias de la clase. Sin embargo, el constructor predeterminado generado no hará nada.

Qué agregar el conjunto vacío de paréntesis en new Foo() doe es el valor inicializar el objeto asignado, lo que significa que los miembros se inicializan a sus valores "predeterminados", que es cero para los valores enteros y de punto flotante, y nullptr para punteros.

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