Question

Je suis nouveau à C ++ et j'ai une question ...

Je me répondre essayé de la question en faisant une application de test ... dans le débogage, l'initialisation de la classe B génère moins de code d'assemblage, mais en mode de libération, je ne peux pas vraiment dire ... il optimise loin les initialisations :(

Disons que j'ai deux classes:

class A
{
public:
    int a, b, c, d;

    A(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d)
    {
    }
};

class B
{
public:
    int a, b, c, d;
};

Y at-il avantage d'utiliser

B b = {1, 2, 3, 4}

au lieu de

A a = A(1, 2, 3, 4);

Était-ce utile?

La solution

Je ne sais pas sur les avantages de performance, mais en général en utilisant le constructeur est préféré.

En effet, avec A, les membres a, b, c, d peuvent être privées. Ainsi, vous obtenez l'encapsulation avec votre approche A, que vous n'avez pas B.

En tant que concepteur de classe, vous pouvez imposer l'utilisation stricte et l'affectation des variables membres par un constructeur. Dans votre B, scénario de classe, vous ne pouvez pas.

Ainsi, alors que vous pouvez obtenir un petit coup de pouce en perf, pour l'utilisation de B, je parierais qu'il soit négligeable, et serait niée par le mal de tête potentiel d'avoir des membres de la classe non protégés.

Autres conseils

Pour un objets globaux et les membres statiques de classe, la liste des initialiseur n'invoque pas de code à l'heure de l'exécution. (Données d'initialisation sont mémorisées directement dans le binaire).

Si vous initialisez un grand nombre d'objets, ou si le code du constructeur est cher / grande, cela peut faire une différence notable au moment de la charge.

Comme dit, cela est vrai uniquement pour les données pures et simples, à savoir tout ce qui peut être initialisé avec une liste d'initialisation en C ++ <0x

Vous ne devez pas écrire explicitement le constructeur et le code C en utilisant ce type d'initialisation fonctionne en C ++.

Si vous avez compliqué les structures composées de fileds de données simples, l'initialisation des variables peut être plus facile avec des listes d'initialisation qu'avec les constructeurs:

B barr[5] = {
    {1,2,3,4},
    {5,6,7,8},
    ...
  };

L'inconvénient (actuellement) ne fonctionne que pour les classes simples avec seulement les variables membres POD et que les programmeurs pourraient ne pas être très familier avec la syntaxe.

La plupart des classes ne peuvent pas utiliser des listes d'initialisation (encore!), Vous feriez mieux d'utiliser un constructeur juste pour être cohérent. En c ++ 0x std :: initializer_list existera pour permettre cette syntaxe pour toutes les classes.

Voici les scénarios lorsque la liste des initialiseur est utilisé:

  1. Pour l'initialisation des membres de données const non statiques.
  2. Pour l'initialisation des membres de référence.
  3. Pour l'initialisation des objets membres qui ne sont pas constructeur par défaut.
  4. Pour l'initialisation des membres de la classe de base.
  5. Lorsque le nom du paramètre du constructeur est même en tant que membre de données.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top