C ++是否将构造和复制优化为复制构造函数?

时间:2011-08-25 16:33:18

标签: c++

C ++编译器是否自动转换:

MyObject object2 = object1;

MyObject object2( object1 );

或者它是否像对待它一样:

MyObject object2;
object2 = object1;

4 个答案:

答案 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属于不同的类型,那么它将从object1MyObject进行隐式转换,然后从中复制构造object2,或者将隐式转换直接转换为object2并跳过复制构造。在这两种情况下都必须可以访问复制构造函数(或C ++ 11中的移动构造函数)。

相关问题