Warum können wir Klassenmitglieder nicht bei ihrer Deklaration initialisieren?
Frage ich mich, ob es einen Grund gibt, warum können wir nicht initialisieren Mitglieder auf Ihre Erklärung.
class Foo
{
int Bar = 42; //this is invalid
};
Als ein äquivalent der Verwendung von Konstruktor-Initialisierung-Listen.
class Foo
{
int Bar;
public:
Foo() : Bar(42) {}
}
Mein persönliches Verständnis ist, dass das obige Beispiel ist viel mehr Ausdruck und gewollt. Außerdem ist dies eine kürzere syntax. Und ich sehe keine Möglichkeit der Verwechslung mit anderen sprachlichen Elementen.
Gibt es eine offizielle Aufklärung über diese?
InformationsquelleAutor der Frage danijar | 2013-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Initialisierung von nicht-statische member könnten nicht getan werden, wie das vor C++11. Wenn Sie kompilieren mit C++11-compiler, sollte es akzeptieren gerne den code, den Sie gegeben haben.
Ich mir vorstellen, dass der Grund für nicht so dass es in den ersten Platz, weil ein Daten-member-Deklaration ist keine definition. Es ist kein Objekt eingeführt. Wenn Sie ein Datenelement wie
int x;
keineint
- Objekt erstellt wird, bis Sie tatsächlich ein Objekt vom Typ der Klasse. Daher ist eine Initialisierung auf dieses Mitglied wäre irreführend. Es ist nur während der Bauphase, kann ein Wert sein, der dem Mitglied zugewiesen, das ist genau das, was member-Initialisierungs-Listen sind für.Gab es auch einige technische Probleme auszubügeln, bevor nicht-statische member-Initialisierung Hinzugefügt werden konnte. Betrachten Sie die folgenden Beispiele:
Wenn diese Strukturen werden analysiert, die zum Zeitpunkt der Analyse der Mitglied
i
ist es nicht eindeutig, ob es ein Daten-member-Deklaration (wie inS
) oder eine member-Funktion Erklärung (wie inT
).Dank der zusätzlichen Funktionen, ist dies kein problem, weil Sie nicht initialisiert werden ein Mitglied mit diesem Klammern-syntax. Sie müssen eine Klammer-oder-gleich-Initialisierer wie:
Diese können nur Daten von Mitgliedern und so haben wir kein problem mehr.
Siehe den Vorschlag N2628 für eine Gründliche Blick auf die Probleme, die berücksichtigt beim Vorschlag von nicht-statische member-Initialisierungen.
InformationsquelleAutor der Antwort Joseph Mansfield
Der Hauptgrund ist, dass die Initialisierung gilt für ein Objekt, oder
eine Instanz, und in der Deklaration in der Klasse gibt es keine
Objekt oder Instanz; Sie haben nicht, bis Sie beginnen,
Bau.
Gab es eine evolution in diesem Zusammenhang. Bereits bei der
ganz am Ende der Standardisierung von C++98, den Ausschuss Hinzugefügt
Möglichkeit, dies zu tun für static const Mitglieder des integralen
Typ---vor allem, weil diese verwendet werden können, in Kontexten, in denen die
compiler muss in der Lage sein zu sehen, die Initialisierung. In C++11, die
Sprache wurde dahingehend erweitert, dass die Angabe einer Initialisierung in
die Erklärung, aber das ist nur eine Kurzversion—die tatsächlichen
die Initialisierung erfolgt noch an der Spitze der Konstruktor.
InformationsquelleAutor der Antwort James Kanze