C++: Initialisation des variables de membre
J'ai une confusion sur l'initialisation d'une variable membre de la classe.
Suppose que, dans mon .h fichier est:
class Test {
int int_var_1;
float float_var_2;
public:
Test();
}
Mon .rpc serait:
Test::Test() : int_var_1(100), float_var_2(1.5f) {}
Maintenant, quand j'instancie une classe les variables sont initialisées à 100 et 1.5.
Mais si c'est tout ce que je fais dans mon constructeur, je peux faire la suite dans mon .rpc:
int Test::int_var_1 = 100;
float Test::float_var_2 = 1.5f;
Je suis confus quant à la différence entre l'initialisation des variables dans les constructeurs ou avec l'opérateur de résolution.
N'cette façon de l'initialisation des variables en dehors de constructeur de résolution de portée s'appliquent uniquement aux variables statiques ou est-il une façon dont il peut être fait pour les variables normales?
La deuxième méthode ne fonctionne pas car il n'y a pas d'instance et ce sont les variables d'instance - ils besoin d'une instance. En comparant le C++11 dans la classe d'initialisation (
class C {int i = 5;}
), cela fait juste remplit 5 dans le cas où une initialisation aurait pu avoir lieu. Il ne fait pas les initialiser toute version antérieure.OriginalL'auteur madu | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas se substituer l'un à l'autre. Si les variables ne sont pas statiques, vous devez utiliser la liste d'initialisation (ou le corps du constructeur, mais la liste d'initialisation est mieux)*. Si les variables sont statiques, alors vous devez les initialiser dans la définition de la syntaxe dans le deuxième bloc.
* la Sla souligne à juste titre qu'en C++11, vous pouvez également fournir un initialiseur dans la déclaration pour le non-membre statique des variables:
Aura
data(5)
ajouté implicitement à toute liste d'initialisation oùdata
n'est pas mentionné explicitement (y compris implicitement défini par défaut constructeur)C++11 permet de en place de l'initialisation de non-les membres statiques, et la syntaxe ne serait pas celui du deuxième exemple, mais plutôt dans la déclaration du membre.
Vrai que, de son non-static membres et non statique membres, je voulais juste ajouter que pour l'exhaustivité.
Par ailleurs, la référence que vous avez fournie est encore un autre cas que je n'ai pas mentionné:
static const
membres de type intégral ouconstexpr
variables statiques de littéral types peuvent aussi être initialisé dans la déclaration de classe:struct S { static const int i = 10; };
(bien que la définition est toujours nécessaire si la variable est odr-utilisé. A noté le non-static de cas dans la réponse.Les règles exactes ne sont pas aussi simples, et ils sont devenus plus complexes en C++11. À l'intérieur de la définition de la classe, vous pouvez apporter de la valeur à la non-fonctions membres statiques (C++11), ou
static const
variables de types intégraux (C++03), ouconstexpr
littérale types (C++11):struct test { int a = 5; int b; test() : b(10) {} static const int k = 15; static constexpr double d = 10.5; static int s; }; int test::s = 20;
OriginalL'auteur David Rodríguez - dribeas
Vous devez utiliser la première méthode lorsque vous sont en cours d'initialisation non-statique
const
variables (le constructeur). C'est la seule façon vous pouvez modifier ces types de variables membres (sauf si vous êtes à l'aide de C++11).Membre statique des variables peuvent être initialisées à l'aide de la bonne résolution de portée des opérateurs (en dehors de la classe).
Nope, en particulier pour les plus âgés des Kits de développement qui ne peuvent pas utiliser le C++11 pour diverses raisons.
Vous faites un bon point, mais ces situations doivent toujours être considérés comme des "cas limites'. C++11 a vraiment apporté beaucoup de positif à la langue tout en éliminant un certain nombre d'ennuyeux particularités que j'ai vraiment ne peut pas penser à une bonne raison de ne pas l'adopter - à moins que comme tu le dis il y a une lacune dans un SDK pour un très plate-forme spécifique.
OriginalL'auteur Mark Garcia