Es handelt sich da nicht einfach nur um zwei verschiedene Schreibweisen, sondern um zwei fundamendal verschiedene Dinge.
|
C-/C++-Quelltext
|
1
|
tbVector3(const tbVector3& v) : x(v.x), y(v.y), z(v.z) {}
|
Hier werden die Member x, y und z direkt mit den Werten v.x, v.y und v.z initialisiert.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
tbVector3(const tbVector3& v)
{
x=v.x;
y=v.y;
z=v.z;
}
|
Hier dagegen, werden die Member x, y und z erst einmal default initialized (da keine explizite Initialisierung für die Member angegeben wurde). Nachdem alle Member initialisiert wurden, werden x, y und z dann im Body des Konstrukturs die Werte v.x, v.y und v.z zugewiesen.
Beide Varianten drücken also zwei völlig verschiedene Dinge aus. Lediglich in diesem konkreten Beispiel mit dem tbVector3 wird am Ende der gleiche Maschinencode rauskommen, da die Member x, y und z nur einfache floats sind und default initialization eines float einfach nur keiner Initialisierung entspricht. Wären x, y und z allerdings keine Objekten primitiven Typs, dann würde sich die unterschiedliche Bedeutung des Geschriebenen sehr schnell bemerkbar machen, denn dann würden in deiner Variante erst einmal die Default-Konstruktoren von x, y und z aufgerufen und danach den bereits konstruierten Objekten neue Werte zugewiesen. Wenn für den Typ von x, y und z kein Default Konstruktor oder Zuweisungsoperator definiert ist, würde Variante zwei gar nicht erst kompilieren. Selbst wenn, gäbe es potentiell einen unnötigen Konstruktoraufruf im Vergleich zu Variante eins mit der Initialisierungsliste, in der x, y und z einfach direkt mit den entsprechenden Werten konstruiert werden und fertig.