2016-10-05 11 views
6

Podczas nauki języka C++ natknąłem się na następujące pytanie i odpowiedź na pytania praktyczne. Nie rozumiem tego.Konstruktory dla struktur w C++

Dane:

class B {}; 

struct A { 
    A(B b); 
}; 

Wywołać funkcję void test(A a, int* b=0); z dwóch odpowiadających im zmiennych B b, int i;

Odpowiedź jest test(b, &i);

Moje pytanie brzmi, jak to jest wystarczająco, aby przejść niezbędny parametr konstruktora, a właściwie go nie nazwać? W moim umyśle, odpowiedź powinna być:

test(A(b), &i); 

Odpowiedz

8

To działa, ponieważ A ma konstruktora jednego argumentu, który używa C++ jako converting constructor:

konstruktora, który nie jest zadeklarowany ze specyfikacją explicit i które można wywołać za pomocą pojedynczego parametru (aż do C++ 11) jest nazywany konstruktem konwertującym. W przeciwieństwie do konstruktorów jawnych, które są uwzględniane tylko podczas bezpośredniej inicjalizacji (która obejmuje jawne konwersje, takie jak static_cast), konwertujące konstruktory są również brane pod uwagę podczas inicjowania kopiowania, jako część zdefiniowanej przez użytkownika sekwencji konwersji.

Dlatego właśnie C++ może interpretować test(b, &i) jako test(A(b), &i).

Jeśli nie chcesz tego zachowania, zaznacz konstruktora Aexplicit.