我可以将调用复制构造函数的两种语法分为两种不同的方法吗?

问题描述

由于可以通过使用与参数具有相同类型的另一个对象进行构造或通过赋值来调用复制构造函数,所以我想知道是否可以将两者分开。

我尝试进行2种变体(唯一的区别是用于复制对象的代码行)并为两者生成程序集,但是程序集输出完全相同,这使我认为无法区分他们,除非只是“优化”。

我可以有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构造函数。