2013-01-16 39 views
1

所以我只是陷入了一些C++的讨厌。具体而言,通过引用传递匿名变量以用于C++中类的初始化程序列表。考虑下面的代码;匿名变量,通过引用传递,初始值设定项列表

class A { 
public: 
    int x; 

    A(int x=0) : x(x) { 
    std::cout <<"A: creatred\n"; 
    } 

    ~A() { 
    std::cout << "A: destroyed\n"; 
    } 
}; 

class B { 
public: 
    A a; 

    B(const A& in) : a(in) { 
    std::cout <<"B: creatred\n"; 
    } 

    ~B() { 
    std::cout << "B: destroyed\n"; 
    } 
}; 

int main() { 
    B b(A(0)); 
    std::cout << "END\n"; 
    return 0; 
} 

输出:

A: creatred 
B: creatred 
A: destroyed 
END 
B: destroyed 
A: destroyed 

我数2个创作和3个破坏力。这是怎么回事?方式我看到它,我创建b时使用匿名变量A(0)作为输入。不确定事物的顺序是什么。创建一个对匿名变量的引用并用于复制(复制构造函数将在初始化程序列表中调用,是吗?)成员变量a。匿名变量何时销毁?一般来说,为什么我会看到2个构造函数和3个析构函数。谢谢。

+0

他们亲切地称为临时变量++年底被破坏。 –

+0

而不是匿名变量? – gone

回答

4

你没有覆盖A的拷贝构造函数打印一条消息......

具体来说,a(in)调用它。

+0

唉这就是它。感谢您的快速解答。 – gone

3

丢失的构造将是A.

拷贝构造函数您复制构造一个在下面的线。

B(const A& in) : a(in) 

A: destroyed 
END 

这是临时被破坏,它在C的线

B b(A(0)); 
+0

感谢您的解释。仍然试图把我的头围绕着这一切 – gone