【问题标题】:Can I separate the 2 types of syntax that call copy constructors into 2 different methods?我可以将调用复制构造函数的两种语法分成两种不同的方法吗?
【发布时间】:2020-08-18 19:01:47
【问题描述】:

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

我尝试制作 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;
}

【问题讨论】:

  • 它们并不完全相同。使构造函数explicit,即explicit Thing(const Thing&amp; from);,将显示差异。
  • 如果您能做到这一点,您是否打算尝试做一些有用的事情?我很好奇是否有任何实际应用。
  • 可能有点技术含量高,但Thing thing3 = thing1; 中的= 不是作业。它只是看起来像。

标签: c++ g++ copy-constructor constructor-overloading


【解决方案1】:

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

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,那么两个初始化版本都会调用第二个构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多