2016-08-02 16 views
1

Die Klasse Parent ist eine abstrakte Klasse. Hier _isDone, _prob sind protected Variablen von Parent Klasse, die von Child vererbt werden.Aufrufen von Basisklassenkonstruktor und Initialisieren von Elementvariablen in der Child-Klasse

Was ist der Unterschied zwischen der Verwendung von:

Child::Child(int _classType) : Parent(false, 1.0f) für die Variablen der Parent Klasse zu initialisieren.

vs.

Child::Child(int _classType) 
{ 
    _isDone = false; 
    _prob = 1.0f; 
} 

Ich fühle es einfacher ist, die zweite eher als die erste zu verwenden. Irgendein Grund, den ersten zu verwenden.

Antwort

1

Kurze Antwort: Die erste ist Initialisierung, während der zweite ist Zuordnung.

Der erste initialisiert _isDone und _prob mit Parent 's Konstruktor. Wenn Sie jedoch den zweiten verwenden, werden _isDone und _prob mit dem Standardkonstruktor Parent initialisiert, und dann werden ihnen neue Werte im Child10 Konstruktorfunktionskörper zugewiesen.

Die erste ist besser aus den folgenden Gründen:

  1. Wenn Parent nicht Standardkonstruktor haben, kann der zweite nicht funktionieren.
  2. Der erste ist effizienter, besonders wenn das Datenelement ein 'sehr großes' Objekt ist, dessen Standardkonstruktor sehr teuer ist. Da der erste Standardkonstruktor für den Datenmember aufruft, ruft er operator= auf, um einen neuen Wert zuzuweisen, während der zweite nur einen richtigen Konstruktor aufruft. Der Standardkonstruktor ist redundant.
  3. Persönlich glaube ich nicht, dass es eine gute Idee ist, direkt auf das Datenelement zuzugreifen: die Kopplung steigt zwischen Parent und Child.