Frage

Ich bin neu in C ++ und ich habe eine Frage ...

Ich habe versucht, die Frage zu beantworten, mich durch eine Testanwendung zu machen ... in Debug erzeugt die Klasse B Initialisierung weniger Assembler-Code, aber im Release-Modus, kann ich nicht wirklich sagen ... es die Initialisierungen optimiert weg :(

Lassen Sie uns sagen, ich habe zwei Klassen:

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;
};

Gibt es einen Vorteil bei der Verwendung

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

statt

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

War es hilfreich?

Lösung

Ich weiß nicht, über Performance-Vorteile, aber im Allgemeinen verwendet, wird der Konstruktor bevorzugt.

Dies liegt daran, mit A, Mitgliedern a, b, c, d privat gemacht werden können. So Sie Verkapselung mit Ihrem A-Ansatz erhalten, die Sie nicht in B.

Als ein Klasse-Designer können Sie strenge Nutzung und Zuordnung von Elementvariablen über einen Konstruktor erzwingen. In Ihrem B, Klasse Szenario können Sie nicht.

So, während Sie einen kleinen Schub in perf bekommen können, für B verwendet wird, würde ich es Wette vernachlässigbar sein, und würde durch die möglichen Kopfschmerzen von ungeschützten Klassenmitgliedern negiert werden.

Andere Tipps

Für ein globalen Objekte und statische Klassenmitglieder, die Initialisierungsliste aufrufe keinen Code zur Laufzeit. (Initialisierung Daten werden direkt in den binären gespeichert).

Wenn Sie eine Menge von Objekten initialisiert wird, oder wenn der Konstruktor-Code ist teuer / groß, das einen bemerkenswerten Unterschied zur Ladezeit machen kann.

Wie gesagt, gilt dies nur für die guten alte Daten, das heißt alles, was mit einer Initialisiererliste in C initialisiert werden kann ++ <0x

Sie haben nicht explizit auf den Konstruktor und C-Code schreiben mit dieser Art der Initialisierung arbeitet in C ++.

Wenn Sie Verbindungsstrukturen von einfachen Daten fileds kompliziert haben, Initialisierung von Variablen kann einfacher sein, mit der Initialisierung Listen als bei Konstrukteuren:

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

Der Nachteil, dass es (derzeit) funktioniert nur für einfache Klassen mit nur POD Membervariablen und dass Programmierer möglicherweise nicht sehr vertraut mit der Syntax.

Die meisten Klassen können nicht Initialisierung Listen (noch!) Verwenden, so dass Sie besser dran mit einem Konstruktor nur konsequent zu sein. In C ++ 0x std :: initializer_list existieren diese Syntax für jede Klasse zu ermöglichen.

Im Folgenden sind die Szenarien, wenn Initialisiererliste verwendet wird:

  1. Für die Initialisierung der nicht-static const Datenelemente.
  2. Für die Initialisierung der Referenzelemente.
  3. Für die Initialisierung der Member-Objekte, die nicht Standard-Konstruktor haben.
  4. Für die Initialisierung der Basisklasse Mitglieder.
  5. Wenn Konstrukteurs-Parameternamen als Datenelement gleich ist.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top