2012-07-30 23 views
29
// Method One 
class ClassName 
{ 
public: 
    ClassName() : m_vecInts() {} 

private: 
    std::vector<int> m_vecInts; 
} 

// Method Two 
class ClassName 
{ 
public: 
    ClassName() {} // do nothing 

private: 
    std::vector<int> m_vecInts; 
} 

Pregunta> ¿Cuál es la forma correcta de inicializar la variable miembro de vector de la clase? ¿Tenemos que inicializarlo?Forma correcta de inicializar la variable miembro de vector

+1

No, a menos que desee especificar una capacidad inicial (o inicializar su contenido, lo que puede hacer con las listas de inicializadores en C++ 11 o en la 'lista_de' de boost I _think_). – hmjd

+2

El vector de ambos sentidos se construye usando el constructor predeterminado, pero el primero es el preferido –

+1

@ Mr.Anubis: No por mí. –

Respuesta

21

Ver http://en.cppreference.com/w/cpp/language/default_initialization

inicialización por defecto se realiza en tres situaciones:

  1. cuando una variable con duración de almacenamiento automática se declara sin inicializador
  2. cuando se crea un objeto con duración de almacenamiento dinámico por una nueva expresión sin un inicializador
  3. cuando una clase base o un miembro de datos no estáticos no se menciona en una lista de inicializadores de constructor y ese constructor se llama.

Los efectos de inicialización por defecto son:

  • Si T es un tipo clase, el constructor por defecto se llama para proporcionar el valor inicial para el nuevo objeto.
  • Si T es un tipo de matriz, cada elemento de la matriz se inicializa por defecto.
  • De lo contrario, no se hace nada.

Desde std::vector es escribir su constructor por defecto se llama una clase. Entonces la inicialización manual no es necesaria.

+0

sorpresa para mí que 'clase T2 { int mem; public: T2() {} // "mem" no está en la lista de inicializadores }; '' const T2 t2; // ok, llama al ctor predeterminado proporcionado por el usuario // t2.mem está inicializado por defecto' – q0987

+0

Acabo de probar el código anterior en VS2010 y está INCORRECTO. ¡t2.mem NO está inicializado por defecto! – q0987

+1

@ q0987: 'mem' es un' int', no es una clase ni un tipo de matriz, por lo que no se inicializará por defecto. El código proporcionado en cppreference casi siempre se verifica bajo el estándar C++ 11, pero no sé si esto cambia algo para el caso dado (dado el calificador 'const'). Sin embargo, incluso si el ejemplo es \t inconsistente e incluso incorrecto, la explicación y el estándar en sí no lo son. – Zeta

1

No tiene que inicializarlo explícitamente, se creará cuando cree una instancia de su clase.

17

Depende. Si quieres un vector de tamaño 0, entonces no tienes que hacer nada. Si usted quiere, por ejemplo, un tamaño de N vectores de llenado de 42s a continuación, utilizar las listas de inicialización del constructor:

ClassName() : m_vecInts(N, 42) {} 
Cuestiones relacionadas