Initialisierung einer Variablen
-
Guten Abend,
C++ bietet ja zwei Möglichkeiten, eine Variable zu initialisieren:
int a = 7; // 1. Möglichkeit int b(7); // 2. MöglichkeitSind diese beiden Arten vollständig äquivalent? Falls ja, ist dann 1. sozusagen nur die C-like Initialisierung, und 2. die C++ (Konstruktoraufruf-like) Initialisierung?
lg
-
In der Regel ist es das selbe - kein respektabler Compiler wird einen Unterschied machen. Allerdings gibt es ein paar Feinheiten zu beachten.
Konzeptionell: Initialisierung mit = bedeutet Initialisierung von einem anderen Objekt gleichen Typs, d.h. per Kopierkonstruktor. Bei
struct A { A(int); }; // ... A a(123); // Direkt A(int) aufgerufen A a2 = 123; // Implizit 123 in ein temporäres Objekt vom Typ A verwandeln, das dann in a2 kopieren.Der Compiler darf die Kopie wegoptimieren (und man kann sich in der Praxis auch darauf verlassen, dass das passiert). Es hat allerdings den Effekt, dass die Initialisierung per = unter gewissen (und, wenn man das Konzept nicht kennt, verwirrenden) Umständen nicht kompiliert. Beispiele:
struct A { A(int) { }; }; struct B { explicit B(int) { } }; struct C { C(int) { } private: C(C const &); }; struct D { D(int) { } explicit D(D const &); }; int main() { A a = 2; // Geht B b = 2; // Geht nicht, keine implizite Umwandlung von int nach B C c = 2; // Geht nicht, Kopierkonstruktor privat D d = 2; // Geht nicht, Kopierkonstruktor ist explicit A a2(2); // Geht B b2(2); // Geht C c2(2); // Geht D d2(2); // Geht }
-
Na, bei der ersten Methode hast du nicht beliebig viele Parameter.
struct foo { foo(int a, int b){}; }; foo bar1(1, 2); //OK foo bar2 = foo(1, 2); //OK foo bar3 = 1, 2; //...EDIT: seldon bringts perfekt auf den Punkt

-
Danke dir seldon, für deine Erklärung bezüglich benutzerdefinierter Datentypen.

Doch wie schaut es aus, wenn wir uns nur auf der Ebene vordefinierter Datentypen bewegen. Gibt es da auch irgendwelche Feinheiten zu beachten, oder ist es hierbei wirklich gleichwertig? Einen Konstruktor in dem Sinne gibt es ja bei vordefinierten Datentypen nicht, oder?
lg
-
Da ist es völlig gleichgültig. Bei den meisten komplexen Datentypen ist es auch gleichgültig - wenn der Entwickler des Datentyps keine guten Gründe hat, es zu verbieten, wird er es im Zweifel nicht tun.
In Templates tendiere ich dazu, die Klammersyntax zu benutzen, nur für den Fall, aber ansonsten ist das wirklich herzlich egal.
-
Gut, danke dir, alle Fragen beantwortet
