Der neue C++ Standard wird viele Neuerungen mit sich bringen und bereits jetzt unterstützen einige Compiler die neuen Konzepte. Eines der kleineren Neuerungen ist das Schlüsselwort auto.
Es steht für einen unbekannten Datentyp, den der Compiler selbst bestimmt. Am einfachsten versteht man es anhand eines Beispiels.
// verschiedene Variablen anlegen auto var1 = 4; auto var2 = 3.14159; auto var3 = "Hallo"; auto var4 = L"Язык программирования"; auto var5 = new double[10]; // Datentyp der Variablen ausgeben wcout << typeid(var1).name() << endl << typeid(var2).name() << endl << typeid(var3).name() << endl << typeid(var4).name() << endl << typeid(var5).name() << endl; // aufräumen nicht vergessen delete[] var5;
Führt man das Beispiel aus, so bekommt man folgende Bildschirmausgabe zu sehen.
Der Compiler erkennt aus dem Zusammenhang welcher Datentyp gemeint ist und deklariert automatisch eine passende Variable.
Man sollte dieses Konzept nicht mit der dynamischen Datentypzuweisung, wie es sie beispielsweise in PHP gibt, verwechseln. C++ besitzt eine statisch explizite Typisierung, deswegen kann man den Datentyp nach einmaliger Variablendeklaration nicht mehr ändern.
Was in dem ersten Beispiel nach einer Spielerei aussieht, erspart wirklich einiges an Schreibarbeit, wenn die Datentypen etwas komplexer werden.
// Eine Liste mit irgendwelchen Zahlenwerten list<int> numbers; for(int i = 0; i < 10; i++) numbers.push_back(i*i); // Liste durchlaufen ohne auto for(list<int>::iterator it = numbers.begin(); it != numbers.end(); it++) { cout << *it << " "; } // Liste durchlaufen mit auto for(auto it = numbers.begin(); it != numbers.end(); it++) { cout << *it << " "; }
Man kann sich leicht vorstellen, dass bei noch komplexeren Datentypen (z.B. verschachtelte Maps mit Listen) das auto-Schlüsselwort noch mehr an Bedeutung gewinnt. Vor allem wird auch der Programmcode auch etwas leserlicher.
Für weitere Informationen schaut einfach in die MSDN-Dokumentation rein.
Sehr interessant ist auch die Funktionsweise von decltype im Zusammenspiel mit auto.
was ist wcout?
std::cout version für unicode. Könntest du aber auch Google fragen ;)
1.) Was genau ist „list…“? Was macht das?
2.) Für was stehen die „::“?!? Ich hab das bereits an vielen Orten gesehen, aber nie verstanden… Ein Beispiel wäre „std::cout“, aber es gibt auch andere beispiele.
3.) „Numbers.begin(); und Numbers.end();“ sind selbst geschriebene Funktionen? Wie hast du das gemacht?
1) std::list ist eine C++ interne Liste. Hier ist die Referenz dazu: http://www.cplusplus.com/reference/list/list/
2) x::y heißt, dass y sich im x-Namensraum gefindet (das Zeichen gibts aber auch bei Methodendefinition, also Klassenname::Methode ). Hier ne Einleitung: http://www.cplusplus.com/doc/tutorial/namespaces/
3) Die Methoden begin() und end() gehören zu std::list.
In deinem Beispiel kann trotz des Aufrufs von ‚delete‘ ein memory leak entstehen:
auto var5 = new double[10];
//delete var5;
delete [] var5;
Damit wird der Speicher richtig freigegeben. Evtl. verhält es sich bei dem Schlüsselwort ‚auto‘ anders, aber ich wollte es nur mal ansprechen :-)
Danke, auto schützt natürlich nicht vor memory leaks ;)