Objektinitialisierung, Programmieren mit Standardkonformität
Verfasst: Di Mär 06, 2012 10:32 am
[edit] by fat-lobyte:
Dieses Thema wurde aus folgendem abgetrennt: http://www.proggen.org/forum/viewtopic.php?f=21&t=4870, weil sich die Diskussion zu weit vom ursprünglichen Thema entfernt hat. Die Antworten dieses Beitrags beziehen sich auf den anderen Thread.
[/edit]
Ich bin allerdings nicht sicher, ob ich damit glücklich würde.
Gut - das ganze hat bei mir (Genesys) eine vollkommen andere Bedeutung (nämlich den Zugriff auf das 7.3 Element).
Ein Link auf diesen Thread landet bei mir im Wiki.
Wir könnten uns beizeiten nochmal um Erweiterungen im C++-Tutorial unterhalten - das hier scheint mir dafür bereits hervorragend geeignet zu sein...
Dieses Thema wurde aus folgendem abgetrennt: http://www.proggen.org/forum/viewtopic.php?f=21&t=4870, weil sich die Diskussion zu weit vom ursprünglichen Thema entfernt hat. Die Antworten dieses Beitrags beziehen sich auf den anderen Thread.
[/edit]
Seit wann enthält eine Funktionsdefinition Aufrufe von anderen Funktionen/Konstruktoren?fat-lobyte hat geschrieben:Hallo!
Ich möchte nur kurz von meinen Erfahrungen berichten.
Im neuen Standard gibt es einige Änderungen, wie man Objekte und Basisklassen initialisiert.
Wozu ist das überhaupt notwendig?
Betrachtet folgenden Code:Alle dieser vier Zeilen dienen der *Absicht* ein Objekt zu deklarieren und zu initialisieren. Diese sehen aber unterschiedlich aus, und bei Vektor muss man sogar Code für die initialisierung bereitstellen. Warum sage ich "Absicht"? ÜBERRASCHUNG!! Die erste Zeile, die zwar aussieht wie eine Variablendeklaration ist eine Funktionsdefinition!Code: Alles auswählen
rectangle w (origin(), extents()); complex<double> c (2.71828, 3.14159); int a[] = {1, 2, 3, ,4}; vector v; for(int i;i<=4;++i) v.push_back(i);
Das finde ich grundsätzlich gut - allerdings würde ich sie abschaffen - bzw. tue das. int x0 = 7.3 ist bei mir nicht kompilierbar. Die Schreibweise x1{7.3} stellt klar, dass hier ein Konstruktor verwendet wird.fat-lobyte hat geschrieben: Und es verhindert die "Verschmälerung" (narrowing), Beispielsweise von integer und floating point datentypen:Code: Alles auswählen
int x0= 7.3; // ok: aber daten gehen verloren! int x1 {7.3}; // error: narrowing
Ich bin allerdings nicht sicher, ob ich damit glücklich würde.
Gut - das ganze hat bei mir (Genesys) eine vollkommen andere Bedeutung (nämlich den Zugriff auf das 7.3 Element).
Es macht in meinen Augen keinen Sinn hier ein temporäres Objekt zu erstellen. Bug oder Feature?fat-lobyte hat geschrieben:Das habe ich gemacht, und siehe da: zwei Problemchen:
1) Referenzen!Wieso auf einmal? Tja, hier wird aus {a} erstmal ein temporäres Objekt des Typs A erstellt, und mit a initialisiert. Dieses temp. Objekt wäre dann RValue und müsste mit einer nicht konstanten Referenz verknüpft werden. Das macht keinen Sinn: was ist eine Referenz auf ein Temporäres Objekt?Code: Alles auswählen
struct A{}; int main() { A a; A& a_ref{a}; // BUMM!! }
Seltsame Sache ist das, aber leider ist das so, also muss man hier weiterhin a_ref() schreiben.
Wie entsteht die Logik, dass bei {100} eine std::initializier_list< int > erzeugt wird?fat-lobyte hat geschrieben: 2) Wenn der Konstruktor eine intializer_list akzeptieren würde!
Die folgenden zwei Zeilen haben nicht den gleichen Effekt!!Wieso nicht? Nun, das betrifft zwei Konstruktoren des vector's:Code: Alles auswählen
std::vector<int> v(100); std::vector<int> v{100};
Die erste Zeile ruft den ersten konstruktor auf, es wird ein vektor mit 100 Elementen erstellt.Code: Alles auswählen
explicit vector(size_type n); // 1 vector(initializer_list<T>, const Allocator& = Allocator()); // 2
Die zweite Zeile erstellt aber ein objekt vom Typ std::initializer_list<int>, mit einem Element, nämlich 100 -> der zweite Konstruktor wird aufgerufen.
Ich interessiere mich sehr für solche Dinge - mit dem Unterschied, dass ich damit nicht leben muss. Ich muss mich aber damit beschäftigen, damit ich solche Szenarien verhindern kann.fat-lobyte hat geschrieben:Tja, das finde ich persönlich wirklich unschön aber auch damit muss ich Leben.
Ein Link auf diesen Thread landet bei mir im Wiki.
Wir könnten uns beizeiten nochmal um Erweiterungen im C++-Tutorial unterhalten - das hier scheint mir dafür bereits hervorragend geeignet zu sein...