2015-07-01 32 views
5

Ten code dzwoni inny konstruktor w jednej ctor:Delegowanie problemu z konstruktorem - czy jest bezpieczny?

#include <iostream> 
using namespace std; 

class F { 
public: 
    F() { cout << "ctor1\n"; } 
    F(int) { cout << "ctor2\n"; } 
    ~F() { cout << "dtor\n"; } 
}; 
class Foo { 
    F f; 
public: 
    Foo() : f() { cout << "1\n"; } 
    Foo(int i) : f(i) { Foo(); cout << "2\n"; } 
}; 

int main() { 
    Foo object(1); 
    return 0; 
} 

Wynik:

ctor2 
ctor1 
1 
dtor 
2 
dtor 

Wydaje się, że zmienna członkiem f zniszczone dwa razy tutaj, jest to w porządku?

+0

Dodatkowo do odpowiedzi Anton, ja nie rozumiem, dlaczego „ctor2” jest drukowany. Myślę, że powinno to być ctor1 http://coliru.stacked-crooked.com/a/bc8d4be86a5ccebf – user2950911

+0

@ user2950911 Niestety, pomyliłem wersję kodu. Kod został naprawiony. – songyuanyao

Odpowiedz

8

Tutaj

Foo(int i) { Foo(); cout << "2\n"; } 

Nie używasz przekazał mu uprawnienia konstruktora. Co robisz, to tworzenie tymczasowej instancji o wartości Foo w treści konstruktora (i natychmiastowe niszczenie).

Poprawna składnia delegowania konstruktora jest

Foo(int i) : Foo() { cout << "2\n"; } 
+0

Mam to. Dzięki! – songyuanyao

Powiązane problemy