==================================================== Konstruktionen mit Hilfe einer std::initializer_list [TOC] ==================================================== Ein traditionelles Array lässt sich direkt mit einer Werteliste konstruieren: ---- CODE (type=cpp) ---------------------------------------------------------- int values[] = {2, 3, 5, 7, 11, 13}; ------------------------------------------------------------------------------- Es stellt sich daher die Frage, ob dies auch mit selbst-definierten Klassen möglich ist. Und in der Tat wurde dies durch die Einführung der vom Übersetzer unterstützten `std::initializer_list`-Klasse möglich, die über `#include ` zur Verfügung steht. Hier ist ein triviales Beispiel, das die Benutzung zeigt: ---- CODE (type=cpp) ---------------------------------------------------------- #include #include template struct Average { Average(std::initializer_list list) : result(0) { T sum{}; for (auto it = list.begin(); it != list.end(); ++it) { sum += *it; } result = sum / list.size(); } T result; }; int main() { Average avg = {1, 2, 3, 4}; std::cout << avg.result << std::endl; // delivers 2.5 } ------------------------------------------------------------------------------- Wenn der Übersetzer eine in geschweiften Klammern gefasste Initialisierung sieht und es einen passenden Konstruktor mit einer `std::initializer_list` gibt, wird dieser ausgewählt. Dies hat Vorrang vor den anderen Konstruktoren. Die Nutzung regulärer Konstruktoren ohne eine `std::initializer_list` kann durch den Einsatz runder Klammern erzwungen werden. Ferner ist auch die Verwendung von `std::initializer_list` bei Zuweisungen, Parameterübergaben und bei einer _ranged for loop_ möglich. Weitere Infos zu dieser Klasse: http://en.cppreference.com/w/cpp/utility/initializer_list Aufgaben ======== * Ergänzen Sie `array.hpp` um einen entsprechenden Konstruktur und testen Sie diesen mit einem kleinen Testprogramm unter Verwendung von _valgrind_. * Probieren Sie, ob auch eine zwei-dimensionale Matrix mit Hilfe der _Array_-Klasse deklariert und fertig initialisiert werden kann. Fragen hierzu: * Wie ist eine zwei-dimensionale Iteration durch alle Elemente der Matrix möglich mit Hilfe von _ranged for loops_? * Welche Vor- und Nachteile hat so eine Matrix in Vergleich zu den traditionellen Datentypen? * Und zum Schluss ein Knacknuss: Wie effizient wird das zwei-dimensionale Array konstruiert? Gibt es eine Abhilfe oder gibt es hierzu keinen einfachen Workaround? Vorlage ======= :import: session04/step04/array.hpp [fold] :navigate: up -> doc:index back -> doc:session04/page08 next -> doc:session04/page10