Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++ Grundkurs

Initialisierung

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Initialisierung einer Variablen gibt dieser einen definierten Wert. C++ verfügt neben der klassischen Initialisierung mit runden Klammern zusätzlich über die vereinheitlichte Initialisierung mit geschweiften Klammern.
09:42

Transkript

In dieser Lektion will ich Ihnen die Initialisierung von Variablen erklären. Was ich vor allem zeigen will ist, dass es in C++ zwei Arten gibt, Variablen zu initialisieren: über runde und über geschweifte Klammern, und dass gerade die zweite Art: die Initialisierung geschweifte Klammern, als vereinheitlichte Initialisierung bekannt ist, weil sie alles, was Sie initialisieren wollen, über geschweifte Klammern initialisieren können. Doch von Anfang an. Ich habe hier geschrieben, Variablen können direkt bei der Definition initialisiert werden. Das ist nicht ganz richtig. Variablen sollen direkt bei der Definition initialisiert werden. Das muss ich sogar noch verstärken, wenn es um Const-Variablen geht. Die müssen bei der Definition initialisiert werden. Was klar ist: Der Typ der Variable muss zum Typ des initialen Wertes passen. Dieser Satz, der Typ der Variable muss zum Typ des initialen Wertes passen, besitzt leichte Einschränkungen. Zum einem führt der Compiler implizite Konvertierungen aus. Zum anderen werden natürlich Typen so erweitert, dass sie passen. Das wäre das Promotion. Oder verengt. Das wäre das Narrowing. Aufs Narrowing gehe ich gleich weiter ein. Es gibt viele Arten, um Variablen zu initialisieren. Es sind, ehrlich gesagt, nicht viele. Es sind zur vier. Hier habe ich die Zuweisung und die Copyinitialisierung in zwei Formen dargestellt. Die klassische Form max = 100, max (100). Das ist die klassische Form, und jetzt kommt die Form mit den geschweiften Klammern. Erst die Zuweisung und dann die Copyinitialisierung. In diesen Formen gibt es einen entscheidenden Unterschied. Der erste entscheidende Unterschied ist, bei den Initialisierungen mit geschweiften Klammern findet keine Verengung statt. Was sind Verengungen oder englisch Narrowing? Das ist der heimliche Verlust der Datengenauigkeit. Sehen Sie sich die Beispiele hier genau an. Wenn ich int i1 mit 3.14 initialisiere, ist das ok für den Compiler, obwohl ich in int i nur den Wert 3 habe. Der schneidet das .14 ab. Wenn ich das Gleiche mit geschweiften Klammern mache, ignoriert das der Compiler, und ich bekomme einen Compilierungsfehler. Das trifft für die Copyinitialsierung und für die Zuweisung zu. Das gleiche Beispiel hier nochmal mit char. Ich kann 999 verwenden, um c1 zu initialisieren. Das nimmt der Compiler an. Verwende ich aber die geschweiften Klammern, moniert das der Compiler. Der Compiler ist aber so intelligent, dass er es erlaubt, eine 8 in das Zeichen c3 reinzuschreiben. 8 passt in c3, ohne dass der Datentyp modifiziert werden müsste. Nun komme ich zum letzten Punkt: der vereinheitlichten Initialisierung über die sog. Brace Initialisiererliste oder {}-Initialisiererliste. Dafür hat sich noch kein eindeutiger Namen durchgesetzt. Das ist eine relativ neue Technik. Diese geschweiften Klammern erlauben eben, alles zu initialisieren, was Sie initialisieren wollen, und auf eine vereinheitlichte Art und Weise. Sie können z.B. Container der STL jetzt direkt initialisieren. std::vectory intVec{1, 2, 3, 4, 5} und der Standardvektor ist initialisiert und hat danach 5 Elemente. Sie können die Konstanten Heap-Arrays direkt initialisieren: const float* p = new const. Das ist ein Pointer auf float, der const ist. Das initialisieren Sie mit new const float[2] {1.2, 2.1}. Sie können C-Arrays als Attribut einer Klasse direkt initialisieren. Sie können auch die geschweiften Klammern verwenden, um einen Statdardstring default zu initialisieren, oder Sie können direkt Instanzen einer Klasse initialisieren. Diese Klasse MyClass hat zwei Attribute einen int-Wert und einen float-Wert oder auch ein double. Das weiß ich jetzt nicht. Sie können diese Instanz der Klasse direkt über diese {}-Initialisierung initialisieren. Die Regel ist extrem einfach. Eine {}-Initialisierung ist in allen Initialisierungen anwendbar. Das war relativ viel Theorie. Nun sollte wieder die Praxis folgen. Ich fange einmal relativ einfach an. Ich habe hier ein bool b. Ich initialisiere es über true. Einmal über die Copyinitialisierung, einmal über die Zuweisung. Das Gleiche machen wir mit int i. Das Gleiche machen wir mit string s. Damit will ich nur zeigen, es funktioniert überall gleich. Jetzt habe ich hier eine Struktur MyStruct und eine Klasse MyClass und die Instanzen meiner Struktur MyStruct und meiner Klasse MyClass kann ich direkt über Initialisiererlisten initialisieren. Natürlich haben basic und basic2 eine Variable vom Typ int und vom Typ double. Genauso wie sie Instanzen der Klasse MyClass besitzen. Das zeige ich am besten gleich einmal. MyStruct hat hier ein int und ein double. MyClass hat auch ein int und ein double. Damit ich darauf zugreifen kann, muss ich natürlich hier sagen: diese zwei Variablen sollen public sein. Nun gehe ich wieder runter im Text und jetzt kann ich basic.x und alsoClass.y ausgeben, und Sie sehen nichts Spannendes. Genau das, was Sie erwarten. Genau die Werte, die ich hineingeschoben habe, sehe ich auch hier. Weiter im Text. Hier das Beispiel, wo ich einen Pointer auf ein const float Array direkt initialisiere. Ich gebe zu, die Syntax ist nicht unbedingt leicht zu lesen. Jetzt weiter im Text. Jetzt kommt ein sehr interessantes Beispiel. Hier initialisiere ich einen Vektor oneElement, der ints hält mit einem einzigen int 1. Einmal Copyinitialisierung, einmal Zuweisung. Und das interessanteste Beispiel dieses ganzen Codes sind die zwei Beispiele hier. Hier habe ich eine unordered_map vom Std::string nach int. Was ist eine unordered_map? unordered_map ist in anderen Programmiersprachen auch unter dem Begriff assoziatives Array, Dictionary oder Hash bekannt. Im Prinzip ist es eine Datenstruktur, die Paare von Keyvalues enthalten. Das sind die Paare. Erstes Paar, zweites Paar, drittes Paar, viertes Paar. Die Idee ist die, dass Sie das erste Element verwenden, um auf das zweite Element zuzugreifen. Das erste Element wird dann in der Regel Key genannt oder Schlüssel, das zweite Element Value oder Wert. Diese Datenstruktur ist extrem praktisch, wenn es darum geht, z. B. ein Telefonbuch abzubilden. In einem Telefonbuch fragen Sie mit dem Namen nach und wollen als Antwort die Telefonnummer dieser Person haben. Da ist also der Name der Key und der Value die Telefonnummer. Hier zeigen ich Ihnen, wie Sie einfach so ein Dictionary oder eine unordered_map - wie es in C++ heißt - initialisieren können. Das war früher viel, viel umständlicher mit pushback. Dann gehe ich über das Dictionary drüber. Ich nehme von um2 - das ist das zweite Dictionary - jedes Paar, also das este Paar, das zweite Paar, das dritte Paar, das vierte Paar. Ich iteriere über jedes Paar und gebe den ersten und den zweiten Wert aus. Der erste ist der Key, der zweite Wert ist der Value. Dann sehen Sie, Hamming 1968, Scott 1976. Das war ein Dictionary, und was das Entscheidende war, selbst so eine komplizierte Datenstruktur können Sie mit Initialisiererlisten direkt initialisieren. Nun gehe ich ein Stückchen weiter. Sie können auch einen Vektor direkt initialisieren. Dieser Vektor - darum heißt er so - erwartet ein Argument, einen Vektor von ins. Ich zeige Ihnen die Deklaration bzw. auch schon die Definition des Vektors. getVector erwartet eine konstante Referenz auf einen Vektor von ins, und diesen Vektor kann ich direkt initialisieren, indem ich hier sage, schiebe von dem ersten Vektor das erste Element da rauf und dann noch die 5, die 10, die 20 und die 30. Ich kann mit dem Vektor hier noch weiterarbeiten. Hier ist noch einmal ein Vektor. Den initialisiere ich leer. Sie sehen die leeren geschweiften Klammern. Jetzt sage ich, schiebe hinten drauf vec.end, die Elemente 99.88, -1 und 15. Wenn ich dann diesen Vektor ausgebe, indem ich über alle Elemente des Vektors iteriere, sehen Sie, ich bekomme heraus 99, 88, -1 und 15. Nun noch zum letzten Beispiel. Telephone tel(getTelephone). getTelephone gibt eine Initialisiererliste zurück, und die kann ich direkt verwenden, um mein Objekt von Typ Telephone zu instanziieren. Das Objekt heißt in diesem Fall tel. Da schaue ich wieder einmal hoch mit Ihnen. getTelephone gibt eine Initialisiererliste zurück. Der erste Wert ist ein Name, mein Name, der zweite Wert eine Telefonnummer. Sie sehen, diese zwei Werte korrespondieren genau mit diesem std::string hier oben in dieser int number. D. h., der Compiler macht aus dieser Initialisiererliste implizit eine Instanz der Klasse Telephone, und diese Instanz kann ich verwenden, um mein Telephone Objekt zu initialisieren. Hier gebe ich noch die Werte aus. tel.name: mein Name und tel.number meine Nummer. Genau das sehen Sie hier. In dieser Lektion habe ich Ihnen die Initialisierung von Variablen gezeigt. Insbesondere habe ich Ihnen gezeigt, dass die Initialisierung mit geschweiften Klammern der mit runden Klammern eindeutig vorzuziehen ist. Erstens funktioniert die Initialisierung mit geschweiften Klammern in allen Kontexten und zweitens bei der Initialisierung mit geschweiften Klammern findet kein Narrowing, keine Verengung des Datentyps statt, was einen Verlust von Datengenauigkeit bedeutet.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!