这样做之间的区别是什么:
class_name object_name = something;
和
class_name object_name(something);
根据我的阅读here,两者都使用了复制构造函数,但我不理解为什么会发生这种情况以及隐式转换是如何发挥作用的。我是如何理解它(在阅读它之前)是第一个使用默认赋值运算符(如果没有定义)通过创建临时对象然后调用复制构造函数,但这似乎是错误的。我问的是因为我读到,当复制构造函数显式时,第一个选项将失败,即使某些东西是class_name类型,所以这两个选项必须足够不同。也是在第一个选项中的复制构造函数之上使用的赋值运算符(使用默认或用户定义的实现),还是只是一个用户友好的语法形式来调用复制构造函数?
答案 0 :(得分:1)
如果复制构造函数是显式的,那么第一个表单只能通过编写:
来实现class_name object_name = class_name(something);
即。显式调用复制构造函数。
最后,如果复制构造函数是显式的,只需使用第一个表单,如果这是明确的(提防最令人烦恼的解析),或者对于额外的c ++ 11点使用大括号初始化语法,它永远不会暧昧:
class_name object_name{something};
或使用Herb Sutter的“几乎总是自动”的想法:
auto object_name = class_name{something};
要回答您的其他问题,此处不使用分配或复制赋值运算符。复制赋值运算符用于将复制分配给先前初始化的变量:
class_name object_name;
object_name = class_name(something); // uses class_name& operator= (class_name& other)
答案 1 :(得分:1)
复制构造函数和赋值运算符不是一回事。
Test(const Test &t)
{
std::cout<<"Copy constructor called "<<std::endl;
}
Test& operator = (const Test &t)
{
std::cout<<"Assignment operator called "<<std::endl;
return *this;
}
Test t1, t2;
t2 = t1;
Test t3 = t1;
在此示例中,为t2 = t1
调用赋值运算符,并为t3 = t1
调用复制构造函数。
如果你复制构造函数是显式的,你必须像这样调用它:
Test t3(t1);