C ++编译器是否自动转换:
MyObject object2 = object1;
到
MyObject object2( object1 );
或者它是否像对待它一样:
MyObject object2;
object2 = object1;
答案 0 :(得分:8)
是的,这是第一个。这不是“优化”;它们是两种不同的语法,用于调用复制构造函数。
如果您想证明它,请尝试为MyObject
定义一个私有赋值运算符。代码仍然应该编译,这证明它不能等同于第二种机制。
答案 1 :(得分:2)
您可以尝试此操作以查看确切的行为:
#include <iostream>
class MyObject {
public:
MyObject() {
std::cout << "MyObject()" << std::endl;
}
MyObject(const MyObject& other) {
std::cout << "MyObject(const MyObject& other)" << std::endl;
}
MyObject& operator=(const MyObject& other) {
std::cout << "operator=(const MyObject& other)" << std::endl;
return *this;
}
};
int main() {
MyObject object1;
MyObject object2 = object1;
MyObject object3(object1);
MyObject object4;
object4 = object1;
}
输出:
MyObject()
MyObject(const MyObject& other)
MyObject(const MyObject& other)
MyObject()
operator=(const MyObject& other)
除此之外,我建议阅读What is The Rule of Three?
答案 2 :(得分:2)
使用MyObject object2 = object1;
调用的是构造函数,因为这是初始化。这与赋值运算符无关。
但是,您建议从MyObject object2 = object1;
转换为MyObject object2(object1);
的转换不会发生,因为这两个初始化语法不同。它们之间的相似之处在于它们都通过调用构造函数来初始化对象,但它们之间略有不同。
如果你有:
struct MyObject {
explicit MyObject(MyObject const&);
};
然后MyObject object2 = object1;
格式不正确,但MyObject object2(object1);
格式正确。
答案 3 :(得分:1)
MyObject object2 = object1;
是复制初始化。如果object1
的类型为MyObject
,则会调用复制构造函数。
如果object1
属于不同的类型,那么它将从object1
到MyObject
进行隐式转换,然后从中复制构造object2
,或者将隐式转换直接转换为object2
并跳过复制构造。在这两种情况下都必须可以访问复制构造函数(或C ++ 11中的移动构造函数)。