假设我有这个功能:
void my_test()
{
A a1 = A_factory_func();
A a2(A_factory_func());
double b1 = 0.5;
double b2(0.5);
A c1;
A c2 = A();
A c3(A());
}
Run Code Online (Sandbox Code Playgroud)
在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?
我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.
我已经读过C++入门加上那些说的
实现可以选择通过两个步骤处理此语句:使用复制构造函数创建临时对象,然后使用赋值将值复制到新对象.也就是说,初始化始终调用复制构造函数,并使用=运算符进行表单也可以调用赋值运算符
而且我也看到在一些网站上写着这样的代码A a2 = a1;是一样的A a2(a1);,这意味着A a2 = a1只有调用拷贝构造函数.
所以我的问题是当程序只使用复制构造函数时,它同时使用复制构造函数和赋值运算符.谁决定这个,是编译器吗?
我编写了以下程序来测试何时调用复制构造函数以及何时调用赋值运算符:
#include
class Test
{
public:
Test() :
iItem (0)
{
std::cout << "This is the default ctor" << std::endl;
}
Test (const Test& t) :
iItem (t.iItem)
{
std::cout << "This is the copy ctor" << std::endl;
}
~Test()
{
std::cout << "This is the dtor" << std::endl;
}
const Test& operator=(const Test& t)
{
iItem = t.iItem;
std::cout << "This is the assignment operator" << std::endl;
return *this;
}
private:
int iItem;
};
int main()
{
{
Test …Run Code Online (Sandbox Code Playgroud)