W tej deklaracji
toto t = new toto(0);
obiekt t
typu klasy toto
jest inicjowany przez wskaźnik zwracany przez wyrażenie new toto(0)
. Ponieważ zwrócony wskaźnik nie jest równy nullptr
następnie jest niejawnie konwertowane na wartość logiczną true.
Więc w rzeczywistości masz
toto t = true;
z wyjątkiem przecieku pamięci, ponieważ adres przydzielonego obiektu został utracony. Dlatego przydzielony obiekt nie może zostać usunięty.
Możesz sobie wyobrazić powyższą deklarację w następujący sposób.
toto *ptr = new toto(0)
toto t = ptr;
Więc pierwszy wiersz tego wyjścia
constructor bool:false
constructor bool:true
odpowiada dynamicznie tworzonemu obiektowi z argumentem 0
new toto(0)
Następnie zwrócony wskaźnik jest używany jako inicjator i jest niejawnie konwertowany na wartość logiczną true
który jest używany do inicjalizacji zadeklarowanego obiektu t
. Zatem druga linia pokazuje wywołanie konstruktora konwersji (konstruktora z parametrem) z wartością true.
Nie ma wielkiej różnicy między powyższą deklaracją a tą instrukcją przypisania
t = new toto(false);
ponieważ ponownie wskaźnik jest używany po prawej stronie zadania.
Tak więc niejawnie zdefiniowany operator przypisania kopii konwertuje wartość wskaźnika, która nie jest równa nullptr
do wartości logicznej true
.
To zadanie możesz sobie wyobrazić w następujący sposób