由于可以通过使用与参数类型相同的另一个对象进行构造或通过赋值来调用复制构造函数,因此我想知道是否可以将两者分开。
我尝试进行两种变体(唯一的区别是用于复制对象的代码行)并为两者生成程序集,但是程序集输出完全相同,这使我相信除非有区别,否则无法区分它们。它只是“优化”。
我可以有2种不同的副本构造函数,一种用于Thing thing2(thing1),一种用于Thing thing2 = thing1吗?

#include <iostream>
class Thing {
public:
    Thing() {
    }
    Thing(const Thing& from) {
        std::cout << "Copy constructor\n";
    }
};
int main()
{
    Thing thing1;
    Thing thing2(thing1); // This line is identical
    Thing thing3 = thing1; // to this one
    return 0;
}

最佳答案

是的,在您的特定示例中,您可以像这样区分两个版本:

class Thing {
public:
    Thing() {
    }
    explicit Thing(Thing& from) {
        std::cout << "Constructor One\n";
    }
    Thing(Thing const&) {
        std::cout << "Constructor Two\n";
    }
};
现在初始化将调用不同的构造函数:
int main()
{
    Thing thing1;
    Thing thing2(thing1);  // Constructor One
    Thing thing3 = thing1; // Constructor Two
    return 0;
}
这是demo
请注意,这仅适用于您的示例,因为thing1是非常量的。如果是const,则两个初始化版本都将调用2nd构造函数。

10-06 03:41