2011-04-17 27 views
9

Estoy leyendo la primera edición de C++ de Stanley Lipmann y estoy en la página 92 ​​sobre la inicialización de valores.Inicialización del valor de C++

Simplemente no entiendo cuándo sobre la inicialización de valor. Busqué y sé que también hay una inicialización predeterminada y cero inicialización. ¿Alguien puede explicar sobre la inicialización de valor?

Llegando a este párrafo ..

inciso a)

"Algunas clases no define por defecto constructor. No podemos inicializar vectorial de un tipo tal especificando solamente un tamaño, nos también debe especificar un valor inicial "

Entiendo lo anterior, pero me parece que los siguientes contradicen el ab ove oración

cláusula b)

"tipo de elemento puede ser de un tipo de clase que no define ningún constructor. En este caso, la biblioteca todavía crea un objeto de valor inicializado. Se hace por valor de inicialización cada miembro de ese objeto "

No entiendo la cláusula b.

Cualquier ayuda se agradece

Respuesta

8

a) Esto es cierto, si la clase define otros constructores - suprimiendo así la generación de un constructor predeterminado.

struct Foo { 
    Foo(int n) : mem(n) {} 
    int mem; 
}; 

Esta clase no se puede inicializar con valores.

b) Si la clase tiene no hay constructores definidos, valor de inicialización simplemente valor-inicializar todos los sub-objetos (clases base y miembros no estáticos)

struct Foo { 
    Foo() : mem(0) {} 
    int mem; 
}; 

struct Bar { 
    Foo f; 
}; 

Value-inicialización de Bar simplemente significa que el miembro f se inicializará en valor.

Véase p. What do the following phrases mean in C++: zero-, default- and value-initialization?

+0

¿Puede darme algún ejemplo para la cláusula b)? – yapkm01

+0

@ yapmk01: respuesta actualizada con algunas muestras – Erik

+0

Soy nuevo en C++. Soy de origen Java. La cláusula b) mencionó a Foo(): mem (0) {} .. ¿No es Foo() un constructor predeterminado? En Java, un constructor predeterminado es uno sin ningún parámetro.¿Puede la clase C++ no tener ningún constructor (es decir, tampoco un constructor predeterminado)? Por lo que entiendo ... si no proporciona ningún constructor, el compilador generará el predeterminado para usted. Si la clase C++ no puede tener ningún constructor, ¿cómo se inicializa? – yapkm01

0
#include <vector> 
#include <string> 
class fooz { 
    private: 
     string s; 
     int n; 
    public: 
     fooz(string& str, int num) { 
      s=str; 
      n=num; 
     } 
     ~fooz(){} 
     void gets(string& str) {str=s;} 
     void getn(int& num) {num=n;} 
}; 
vector<class fooz> vfDialpad = { 
    fooz(string(""),0), 
    fooz(string(""),1), 
    fooz(string("abc"),2), 
    fooz(string("def"),3), 
    fooz(string("ghi"),4), 
    fooz(string("jkl"),5), 
    fooz(string("mno"),6), 
    fooz(string("pqrs"),7), 
    fooz(string("tuv"),8), 
    fooz(string("wxyz"),9) 
}; 

Después de esto, ambas reglas se han activado. esta es una lista de inicializadores y es nueva para C++, puede o no encontrarla solo en las versiones más nuevas de gcc. cada elemento obtiene el nuevo objeto inicializado.

tal vez no estoy dando el mejor ejemplo aquí, pero es un comienzo.