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 🙂


Anmelden zum Antworten