2015-07-01 17 views
5

Questo code sta chiamando un'altra ctor in una ctor:Delega del problema con il costruttore - È sicuro?

#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; 
} 

Il risultato è:

ctor2 
ctor1 
1 
dtor 
2 
dtor 

sembra che la variabile membro f distrutta due volte qui, va bene?

+0

In aggiunta alla risposta di Anton, io non vedo il motivo per cui "ctor2" è in fase di stampa. Penso che questo dovrebbe essere ctor1 http://coliru.stacked-crooked.com/a/bc8d4be86a5ccebf – user2950911

+0

@ user2950911 Spiacente, ho confuso la versione del codice. Il codice è stato corretto – songyuanyao

risposta

8

Qui

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

Non si sta utilizzando costruttore delegante. Quello che stai facendo è creare un'istanza temporanea di Foo nel corpo del costruttore (e distruggerla immediatamente).

La sintassi corretta per la delega costruttore è

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

L'ho capito. Grazie! – songyuanyao