2010-07-16 17 views
6

Es una pregunta básica, pero tengo dificultades para encontrar una respuesta definitiva.¿Cómo se pueden inicializar los campos de clase?

¿El inicializador enumera la forma solamente manera de inicializar campos de clase en C++, además de la asignación en métodos?

En caso estoy usando la terminología equivocada, esto es lo que quiero decir:

class Test 
{ 
public: 
    Test(): MyField(47) { } // acceptable 
    int MyField; 
}; 

class Test 
{ 
public: 
    int MyField = 47; // invalid: only static const integral data members allowed 
}; 

EDITAR: en particular, no es una buena manera de inicializar un campo con una estructura struct inicializador? Por ejemplo:

struct MyStruct { int Number, const char* Text }; 

MyStruct struct1 = {}; // acceptable: zeroed 
MyStruct struct2 = { 47, "Blah" } // acceptable 

class MyClass 
{ 
    MyStruct struct3 = ??? // not acceptable 
}; 
+0

En C++ la instancia estructura con llaves vacías normalmente no se pone a cero, pero contendrá valores de basura. Las excepciones pueden estar en un entorno de depuración o situación similarmente controlada. –

+0

@SEinarsson - oh ... ¿tiene una referencia para eso? Las llaves vacías se recomiendan en toda la web para inicializar estructuras en C++. –

+0

Espera, ahora no estoy tan seguro. He encontrado personas en la web que dicen que estoy equivocado, pero no hay una definición formal para el {} patrón. La siguiente pregunta implica que las clases de estructuras en C++ tienen constructores por defecto de cero, cuando se usan en un inicializador de clase (vea la segunda respuesta) http://stackoverflow.com/questions/112085/is-este-sistema-inicialización-de-estructuras- truco-seguro Simplemente ignore mi comentario anterior hasta que pueda aclarar esto. –

Respuesta

5

En C++ x0 la segunda manera debería funcionar también.

¿El inicializador enumera la única manera de inicializar campos de clase en C++?

En su caso con su compilador: Sí.

0

La manera recomendada y preferida es inicializar todos los campos en el constructor, exactamente como en su primer ejemplo. Esto es válido también para las estructuras. Ver aquí: Initializing static struct tm in a class

3

Los miembros estáticos se pueden inicializar de manera diferente:

class Test { 
    .... 
    static int x; 
}; 

int Test::x = 5; 

no sé si se llama a este 'bonito', pero se puede inicializar miembros de la estructura bastante limpia, así:

struct stype { 
const char *str; 
int val; 
}; 

stype initialSVal = { 
"hi", 
7 
}; 

class Test { 
public: 
    Test(): s(initialSVal) {} 
    stype s; 
}; 
+0

"Bueno" es subjetivo, por supuesto. Gracias por mostrar cómo inicializar las estructuras. Encuentro esto bastante desagradable, pero dado que no tengo otra opción ... :) –

1

Sólo para mencionar que en algunos casos, no tiene más remedio que utilizar listas de inicializador para establecer el valor de un miembro de la construcción:

class A 
{ 
private: 

    int b; 
    const int c; 

public: 

A() : 
    b(1), 
    c(1) 
{ 
    // Here you could also do: 
    b = 1; // This would be a reassignation, not an initialization. 
     // But not: 
    c = 1; // You can't : c is a const member. 
} 
}; 
Cuestiones relacionadas