2016-10-05 4 views
6

Ich stieß auf die folgende Praxis Frage und Antwort während des Studiums C++ und ich verstehe es nicht.Konstruktoren für Strukturen in C++

Gegeben:

class B {}; 

struct A { 
    A(B b); 
}; 

Rufen Sie die Funktion void test(A a, int* b=0); mit den beiden entsprechenden Variablen B b, int i;

Die Antwort ist test(b, &i);

Meine Frage ist, wie ist es genug passieren der notwendige Parameter des Konstruktors und nicht wirklich nennen? In meinem Kopf hätte die Antwort gewesen:

test(A(b), &i); 

Antwort

8

Dies funktioniert, weil A ein einziges Argument Konstruktor hat, die C++ verwendet als converting constructor:

Ein Konstruktor, der nicht mit dem Spezifizierer deklariert explicit und die mit einem einzigen Parameter (bis C++ 11) aufgerufen werden kann, wird Converting-Konstruktor genannt. Im Gegensatz zu expliziten Konstruktoren, die nur bei der direkten Initialisierung berücksichtigt werden (einschließlich expliziter Konvertierungen, z. B. static_cast), werden konvertierende Konstruktoren bei der Kopierinitialisierung als Teil der benutzerdefinierten Konvertierungssequenz ebenfalls berücksichtigt.

Deshalb kann C++ test(b, &i) als test(A(b), &i) interpretieren. Wenn Sie dieses Verhalten nicht möchten, markieren Sie den Konstruktor Aexplicit.