2015-07-01 15 views
5

code này được gọi ctor khác nếu thuộc một ctor:Vấn đề về nhà thầu ủy quyền - Có an toàn không?

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

Kết quả là:

ctor2 
ctor1 
1 
dtor 
2 
dtor 

Có vẻ như các thành viên biến f phá hủy hai lần ở đây, là nó rồi?

+0

Ngoài ra để trả lời Anton, tôi không thấy lý do tại sao "ctor2" đang được in ra. Tôi nghĩ rằng điều này nên được ctor1 http://coliru.stacked-crooked.com/a/bc8d4be86a5ccebf – user2950911

+0

@ user2950911 Xin lỗi, tôi bối rối phiên bản của mã. Mã đã được sửa. – songyuanyao

Trả lời

8

Đây

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

Bạn đang không sử dụng constructor ủy thác. Những gì bạn đang làm là tạo một thể hiện tạm thời của Foo trong phần thân của hàm tạo (và hủy nó ngay lập tức).

Cú pháp đúng cho ủy constructor là

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

Tôi hiểu rồi. Cảm ơn! – songyuanyao

Các vấn đề liên quan