ue4 son sobrecarga que los implementa ejemplos definicion copia constructores como c++

son - ¿Tiene una estructura c++ un constructor por defecto?



que son los constructores en c (5)

¿Es cierto que los miembros de datos de una estructura en C ++ siempre se inicializan por defecto (en comparación con c)? ¿O el resultado observado es solo una coincidencia?

Es una coincidencia.

Su código invoca un comportamiento indefinido; a menos que establezcas explícitamente los miembros en 0 , pueden ser cualquier cosa.

Escribí el siguiente fragmento de código:

void foo() { struct _bar_ { int a; } bar; cout << "Value of a is " << bar.a; }

y compilado con g ++ 4.2.1 (Mac). El resultado es "El valor de a es 0".

¿Es cierto que los miembros de datos de una estructura en c ++ siempre se inicializan de forma predeterminada (en comparación con c)? ¿O es el resultado observado solo una coincidencia?

Puedo imaginar que las estructuras en c ++ tienen un constructor predeterminado (ya que una estructura y una clase son casi las mismas en c ++), lo que explicaría por qué el miembro de datos a de la barra se inicializa a cero.


La respuesta simple es sí.
Tiene un constructor por defecto.

Nota: la estructura y la clase son idénticas (aparte del estado predeterminado de los especificadores de acceso).

Pero si se inicializa, los miembros dependerán de cómo se declare el objeto real. En su ejemplo, no el miembro no está inicializado y tiene un valor indeterminado.

void func() { _bar_ a; // Members are NOT initialized. _bar_ b = _bar_(); // Members are zero-initialized // From C++14 _bar_ c{}; // New Brace initializer (Members are zero-initialized) _bar_* aP = new _bar_; // Members are NOT initialized. _bar_* bP = new _bar_(); // Members are zero-initialized // From C++14 _bar_ cP = new _bar_{}; // New Brace initializer (Members are zero-initialized) } // static storage duration objects // i.e. objects at the global scope. _bar_ c; // Members are zero-initialized.

Los detalles exactos se explican en el estándar en 8.5 Initializers [dcl.init] párrafos 4-10. Pero el siguiente es un resumen simplista para esta situación.

Una estructura sin un constructor definido por el usuario tiene un constructor generado por el compilador. Pero lo que hace depende de cómo se usa y, o bien inicializará por defecto sus miembros (que para los tipos de POD generalmente no es nada) o puede cero inicializar sus miembros (lo que para POD generalmente significa establecer sus miembros a cero).

PD. No use _ como el primer carácter en un nombre de tipo. Te encontrarás con problemas.


Las variables miembro de una estructura no se inicializan de manera predeterminada. Al igual que una clase (porque una estructura es exactamente lo mismo que una clase, solo en estructura los miembros son públicos de forma predeterminada).


No confíe en esta funcionalidad, no es estándar

solo agrega

foo() : a() {}

No puedo recordar el estado exacto de gcc 4.2 (creo que es demasiado antiguo) pero si estaba usando C ++ 11, puede hacer lo siguiente

foo()=default;


No es una respuesta, pero puedes tomarlo como si fuera ... si quieres intentarlo:

void foo() { struct test { int value; } x; std::cout << x.value << std::endl; x.value = 1000; } int main() { foo(); foo(); }

En su ejemplo, la memoria ya tenía el valor 0 antes de que se creara la variable, por lo que puede llamarlo una coincidencia afortunada (de hecho, algún sistema operativo pondrá a cero toda la memoria antes de iniciar un proceso, lo que significa que 0 es un valor bastante probable para encontrar en un pequeño programa corto ...), el código anterior llamará a la función dos veces, y la memoria de la primera llamada se reutilizará en la segunda, es probable que la segunda vez imprima 1000. Tenga en cuenta sin embargo que el valor aún no está definido, y que esta prueba puede mostrar o no el resultado esperado (es decir, hay muchas cosas que el compilador puede hacer y generaría un resultado diferente ...)