2010-04-10 56 views
44

¿Cuáles son los valores predeterminados para miembros de una estructura y miembros de una clase en C++ y cómo difieren estas reglas (por ejemplo, entre clases/estructuras/primitivas/etc.)? ¿Hay circunstancias en las que difieran las reglas sobre los valores predeterminados?Cuál es el valor predeterminado para miembros de clase C++

+2

Vea también: http://stackoverflow.com/questions/1613341/what-do-the-following-phrases-mean-in-c-zero-default-and-value-initializati, http: // stackoverflow. com/questions/2417065/c-does-the-default-constructor-initialize-built-in-types, http://stackoverflow.com/questions/1069621/are-members-of-ac-struct-initialized-to- 0-por-defecto – outis

Respuesta

41

No hay diferencias entre las estructuras y las clases en este sentido en C++. Todos se llaman simplemente clase tipos.

Los miembros de los tipos de clase no tienen valores predeterminados en el caso general. Con el fin de para un miembro de la clase para obtener un valor determinista que tiene que ser inicializado, que puede ser realizado por

  • constructor por defecto de la pieza en sí
  • Constructor lista de inicialización de la clase envolvente
  • Inicializador explícitamente especificado para el objeto de la clase adjunta (que incluye inicialización de valor e inicialización con inicializador agregado).

Además, todos los objetos con duración de almacenamiento estática se inicializan al inicio del programa.

Aparte de los casos anteriores, los miembros de la clase, una vez más, no tienen valores predeterminados e inicialmente contendrán valores de basura impredecibles.

+0

Si el almacenamiento estático se inicializa en cero, dependerá del sistema operativo que esté ejecutando. – jpyllman

+12

@jpyllman: No. El almacenamiento estático siempre se inicializa en cero. Está garantizado (requerido) por el idioma, independientemente de cualquier sistema operativo. – AnT

+0

OK, traté de encontrar esa información pero no la encontré. Siempre he supuesto que no está definido a menos que establezca algún valor. – jpyllman

14

Sí, hay uno. Si inicializa un objeto con el constructor por defecto y utilizar paréntesis, a continuación, los miembros de la cápsula será inicializado a cero:

someClass * p = new someClass(); 
+0

Esta afirmación no es verdadera. Es muy dependiente de quién escribió el compilador. No hay nada en el estándar que diga que un valor POD se inicialice a nada a menos que el programador le haya asignado un valor. Esta es la razón por la que existen herramientas de desarrollo como valgrind. – WhoCares

+0

@DamianDixon No, consulte lo siguiente: 'C++ 14 8.5 11' *" Un objeto cuyo inicializador es un conjunto vacío de paréntesis, es decir,(), se inicializará con el valor. "*. '8.5 8' *" Valorizar-inicializar un objeto de tipo T significa: ... si T es un tipo de clase (posiblemente calificado para CV) sin un constructor predeterminado proporcionado por el usuario o eliminado, entonces el objeto tiene cero inicialización ... "*' 8.5 6' * "Inicializar a cero un objeto o referencia de tipo T significa: ... - si T es un tipo de clase no sindicalizada (posiblemente cv calificado), cada miembro de datos no estático y cada subobjeto de clase base tiene cero inicialización ... "* – HolyBlackCat

+0

@HolyBlackCat, Sin embargo, debe utilizar un paréntesis vacío. Si no agrega(), es decir, proporciona algún tipo de inicialización, entonces no obtiene este comportamiento y termina con un POD no inicializado. Entonces el programador tiene que hacer algo para inicializar la variable. – WhoCares

Cuestiones relacionadas