elementinitialisierer - irgendwelche vorteile?
-
hi, oft sieht man sowas:
ProtocolBase::ProtocolBase() : m_logvector_enabled(true) { }das kann man doch auch so schreiben
ProtocolBase::ProtocolBase() { m_logvector_enabled = true; }hat ersteres irgendeinen vorteil?
-
net schrieb:
hi, oft sieht man sowas:
ProtocolBase::ProtocolBase() : m_logvector_enabled(true) { }das kann man doch auch so schreiben
ProtocolBase::ProtocolBase() { m_logvector_enabled = true; }hat ersteres irgendeinen vorteil?
Das erste ist Initialisierung, das zweite Zuweisung (nach einer potentiellen Default-Initialisierung). D.h. die erste Variante ist zum einen effizienter und zum anderen die einzige Möglichkeit um Referenz- und const-Member mit Werten zu belegen.
-
Erstens ersparst du dir damit die Default-Initialisierung des Elements (OK, bei einem bool ist das nicht sehr viel) und zweitens können const-Elemente und Referenzen NUR über die Initialisierungsliste vorbelegt werden.
(aus dem zweiten Punkt ergibt sich auch ein einheitlicherer Stil, wenn man das auf alle Member ausdehnt)
-
net schrieb:
hat ersteres irgendeinen vorteil?
#include <iostream> class A { public: A() { std::cout << "c-tor()\n"; } explicit A(bool b) { std::cout << "c-tor(bool b)\n"; } A& operator =(bool b) { std::cout << "o-tor(bool b)\n"; return *this; } }; class B { public: B() : a(true) { } private: A a; }; class B2 { public: B2() { a = true; } private: A a; }; int main() { std::cout << "-------------B-------------------\n"; B b; std::cout << "---------------------------------\n"; std::cout << "-------------B2-------------------\n"; B2 b2; std::cout << "---------------------------------\n"; }//output
-------------B------------------- c-tor(bool b) --------------------------------- -------------B2------------------- c-tor() o-tor(bool b) ---------------------------------das erste sollte wesentlich schneller als das zweite sen, falls Klasse "A" einen komlizierten c-tor hätte
-
danke für die vielen hilfreichen antworten
