可能重复:
C++ basic constructors/vectors problem (1 constructor, 2 destructors)
我有代码:
#include <iostream>
class A
{
public:
A() { std::cout<<"A::A"<<std::endl; }
~A() { std::cout<<"A::~A"<<std::endl; }
};
class B : public A
{
public:
B(){ std::cout<<"B::B"<<std::endl; }
~B(){ std::cout<<"B::B"<<std::endl; }
};
void Func( A a ){}
int main()
{
B b;
Func(b);
}
VS2010EE输出中的将是:
A::A
B::B
A::~A //why twice? Once on gcc!
A::~A
B::~B
A::~A
但是,当我们有复制构造函数时,输出是:
A::A
B::B
A::A(copy)
A::~A
B::~B
A::~A
答案 0 :(得分:0)
这有点不幸。 VS应该避免第二次复制;都是优化吗?据推测,它在A
的{{1}}部分调用复制构造函数来创建参数(即切片),然后再将该对象复制到堆栈中以进行函数调用。 (在第一个示例中,未调用b
的构造函数,因为生成的复制构造函数不打印输出。)当您提供复制构造函数时,它必须直接在堆栈上创建副本。
答案 1 :(得分:0)
你没有计算所有的构造函数。在第一种情况下,调用复制构造函数以在调用Func
时创建对象的副本(因为该函数按值获取其参数)。
如果您自己没有定义复制构造函数,编译器将为您生成一个。并且编译器生成的复制构造函数不会打印任何内容,因此它不会在输出中显示。
答案 2 :(得分:0)
如果我理解正确,你实际上是在问这个:
为什么VS2010在没有副本时会创建附加临时文件 构造
我唯一的答案是'因为它被允许'。当您使用gcc时,它似乎会被优化掉,并且当您提供用户定义的复制构造函数时,它也会被优化掉。
这种行为有点奇怪,但它完全符合要求。如果所有C ++编译器都执行相同的操作,那么我们只需要一个编译器......