Prefered way of object initialization
-
Hi,
ich habe mich seit laengerer Zeit wieder mit C++ beschaeftigt und seit C++11 gibt es ja auch die Moeglichkeit die Objekte mit {} zu initialisieren und ich habe mich gefragt ob es bei der einfachen Erstellung irgendeinen Vorteil hat.e.g.:
std::string alpha = "mystring"; std::string bravo("mystring"); std::string charlie {"mystring"}; //bzw.: mein Codebeispiel string secondKey{ line.substr(pos + 2, line.size()) };Was genau ist der Unterschied zwischen Klammerinitialisierung und Konstruktorinitialiserung? Soweit ich mich erinnere wird ja bei der "=" Operation das Objekt erst erstellt und dann der Copy Assignment Operator benutzt um den Wert in den String zu kopieren, richtig?
-
-
Ruvi schrieb:
Soweit ich mich erinnere wird ja bei der "=" Operation das Objekt erst erstellt und dann der Copy Assignment Operator benutzt um den Wert in den String zu kopieren, richtig?
Kommt drauf an. Bei deinem Beispiel würde alpha vom Compiler sehr wahrscheinlich zur selben version wie bravo gemacht, da es einfach unnötig ist an dieser Stelle ein temporäres Objekt zu erstellen nur um dann den copy constructor aufzurufen.
-
Xebov schrieb:
Ruvi schrieb:
Soweit ich mich erinnere wird ja bei der "=" Operation das Objekt erst erstellt und dann der Copy Assignment Operator benutzt um den Wert in den String zu kopieren, richtig?
Kommt drauf an. Bei deinem Beispiel würde alpha vom Compiler sehr wahrscheinlich zur selben version wie bravo gemacht, da es einfach unnötig ist an dieser Stelle ein temporäres Objekt zu erstellen nur um dann den copy constructor aufzurufen.
Nicht nur sehr wahrscheinlich, sondern garantiert. Wenn ein neues Objekt initialisiert wird, dann wird das nie durch den Assignment Operator gemacht. Das dort ein
'='steht ist egal. Den Assignment Operator kriegt man nur wenn man einem schon vorhandenen Objekt etwas zuweißt.
-
Nachtrag: OK, ihr redet gar nicht über Assignment Operator, sondern über den Copy Constructor. Wann man den kriegt hat noch weniger damit zu tun ob man
'='schreibt oder nicht, sondern allein damit mit was man das Objekt initialisieren möchte. Wenn du einenstd::stringmit einem anderenstd::stringinitialisierst dann kriegst du den Copy Constructor. Für andere Sachen wieconst char*gibts extra Overloads.