Ich möchte wissen, warum konstante Datenelemente einer Klasse im Konstruktor initialisiert werden müssen und warum nicht woanders? Was bewirkt dies und nicht?
Ich sehe auch, dass nur statische konstante ganzzahlige Daten in der Klasse initialisiert werden können, außer dass nicht alle Datenelemente innerhalb der Klasse initialisiert werden können.
>für zB: - Angenommen, unten ist meine Klassendeklaration
%Vor%Und der Konstruktor ist wie folgt definiert: -
Bearbeiteter Abschnitt: Wie vorheriges Konstruktordefinitionsbeispiel falsch war
%Vor%Bitte korrigieren Sie mich, wenn ich falsch liege. Vielen Dank im Voraus.
Ist nicht initialization , aber Zuweisung .
a
und b
sind bereits konstruiert und Sie ihnen in diesem Fall Werte zuweisen. Das Qualifikationsmerkmal const
erfordert, dass die Variable nach ihrer Initialisierung nicht geändert wird, sodass dieser Auftrag den Vertrag bricht.
Dies ist die Initialisierung mithilfe der Elementinitialisierungsliste .
%Vor%Vielleicht möchten Sie sich diese Antwort von mir ansehen, um den Unterschied zu kennen:
Was ist? der Unterschied zwischen Initialisierung und Zuweisung im Konstruktor?
Wie bei einer anderen Frage, bezüglich können nur statische Konstantenintegraldaten innerhalb der Klasse initialisiert werden, lesen Sie bitte diese Antwort von mir, die ausführlicher erklärt:
Warum kann ich nicht-statische Elemente oder statische Arrays in der Klasse nicht initialisieren?
Was Sie tun, ist keine Initialisierung. Es ist eine Zuweisung, also wird b=9
NICHT sogar kompiliert, weil b
eine const
ist, daher kann ihr kein Wert zugewiesen werden . Es sollte initialisiert sein, und dazu verwenden Sie die Member-Initialisierungsliste als:
In C ++ 11 können Sie die direkte Initialisierung wie folgt verwenden:
%Vor%Weil es konstant ist, kann sein Wert nicht geändert werden. Die Initialisierung an einer anderen Stelle als dem Konstruktor würde eine Standardinitialisierung bedeuten, gefolgt von einer Zuweisung , die für eine Konstante nicht zulässig ist. Es wäre gleichbedeutend damit:
%Vor%Beachten Sie, dass es in C ++ 11 vollkommen in Ordnung ist, dies zu tun:
%Vor%Aber dies folgt den gleichen Regeln, d. h. es gibt keine Zuweisung.
Eine const-Daten sind Daten, die niemals geändert werden können. Es wird einmal initialisiert und behält dann für immer denselben Wert bei.
Aus diesem Grund können Sie nicht einfach irgendwo einen Wert zuweisen.
Im Konstruktor wird jedoch die Initialisierung ausgeführt. Hier gibt es also eine Ausnahme, und Sie können Ihren const-Daten einen Wert zuweisen. Sie können dies auf die klassische Weise tun, oder wie gesagt, als Initialisierungsliste.
Nun, warum Sie das nicht in der Klassendefinition tun können (anders als zB Java), wenn die Variable nicht statisch ist, ist ein anderes Problem, auf das ich keine Antwort weiß.
Sie können const
-Member außerhalb eines Konstruktors nicht initialisieren, da sie const sind. Per Definition können Sie sie nicht ändern, nachdem sie initialisiert wurden, und nachdem das Objekt erstellt wurde, ist alles, was versucht, den Wert festzulegen, eine Änderung.
Wenn der body Ihres Konstruktors eingegeben wird, sind alle Mitglieder und Unterobjekte bereits initialisiert. Das einzige, was der Konstruktor body tun kann, ist zu ändern - und das ist natürlich nicht erlaubt für const
members.
Sie können jedoch eine Initialisierungsliste verwenden.
const-Werte sind als rvalues zu verstehen, daher können sie aufgrund ihrer Konstanz nicht im rechten Teil eines Ausdrucks erscheinen.
also, wenn Sie diesen Ausdruck für den Konstruktor verwenden
%Vor%Sie verwenden den const-Wert als lvalue, genau wie Alsen zuvor erwähnt. Tatsache ist, dass Sie versuchen, einer Variablen einen neuen Wert zuzuweisen, der seinen Wert nicht ändern darf, wenn die Lebensdauer bereits begonnen hat.
Die korrekte Methode, einem konstanten Datenelement Werte zuzuweisen, befindet sich in der ctor-Initialisierungsliste, dh BEVOR die Lebensdauer des Elementwerts beginnt (wie von Nawaz erwähnt):
%Vor%Schließlich können Sie auf dem C ++ 11 Standard initialisieren Alle Datenmitglieder, bei denen es deklariert wurde , genau wie die statischen Konstanten.
Tags und Links c++ constructor class-constants