3

C++ erlaubt eine Klasse instanziiert wird, die öffentlichen Member Wert über eine Initialisierungs Einstelldetailliste, wie das folgende Beispiel zeigt für b1:C++: Wie wird die Konstruktion durch Initialisierungsliste durchgeführt?

class B { 
public: 
    int i; 
    std::string str; 
}; 

B b1{ 42,"foo" }; 
B b2(); 

; Wenn ich jedoch einen Konstruktor

B(int k) { } 

bereitstellen, wird es nicht kompilieren.

Also, was ist hinter der Haube los? Wenn kein Konstruktor bereitgestellt wird, stellt der Compiler einen zur Verfügung? Aber wie könnte es eine Initialisierungsliste geben? Ich dachte, es wird nur einen "leeren" Konstruktor zur Verfügung stellen, der keine Eingabe macht, wie das Beispiel für b2 zeigt. Oder bietet es beides?

Antwort

5

Aber wie könnte es eine mit Initialisierungsliste bieten?

Nein, wird es nicht.

Beachten Sie, dass für list initializationB b1{ 42,"foo" };aggregate initialization durchgeführt wird.

Wenn T ein Aggregattyp ist, wird die Aggregatinitialisierung durchgeführt.

Und Bist ein aggregate type,

Ein Aggregat ist eine der folgenden Arten:

array type 
class type (typically, struct or union), that has 

    no private or protected non-static data members 
    no user-provided, inherited, or explicit constructors (explicitly defaulted or deleted constructors are allowed) 
    no virtual, private, or protected base classes 
    no virtual member functions 

Aus diesem Grund gut B b1{ 42,"foo" }; funktioniert.

Und wenn Sie einen benutzerdefinierten Konstruktor angeben, B wird nicht-Aggregat-Typ, dann Aggregation Initialisierung wird nicht erneut funktionieren. In diesem Fall können Sie nur B wie oder B b2(42); initialisieren, die den entsprechenden Konstruktor aufrufen.

BTW: Nach der Bereitstellung eines benutzerdefinierten Konstruktors (mit einem Parameter) wird der implicitly-declared default constructor nicht vom Compiler erneut deklariert. Es bedeutet B b2; oder B b2{}; wird nicht wieder funktionieren.

BTW2: B b2(); könnte eine Funktionsdeklaration sein. Siehe Most vexing parse.

Verwandte Themen