当前位置: 首页 > 知识库问答 >
问题:

为什么函数返回时不调用复制构造函数?[副本]

严正初
2023-03-14
Line Line::operator =(Line ln) {
        cout << "Assignment operator\n";
        Line temp;
        temp.ptr = new int;
        *temp.ptr = *(ln.ptr);
        return temp;
    }

在上面的代码中,执行以下语句时不调用复制构造函数:

return temp;

既然返回是按值的,为什么不调用复制构造函数?

谢啦

共有3个答案

曹恩
2023-03-14

我想在前面的帖子后面加上一句话,即使在构建目标对象时省略了复制构造函数,它仍然必须是可访问的和已定义的。例如,如果您将复制构造函数声明为私有,那么编译器会发出一个错误(MS VC至少2010有一个错误除外:)

东郭宏朗
2023-03-14

按照上面的设置,编译器很可能会省略复制构造函数,而直接在预期返回值的位置构造临时< code>temp。即使复制构造函数有副作用,复制省略也是显式允许的。然而,即使省略了复制,复制或移动构造函数仍然必须是可访问的,也就是说,复制省略的可能性并没有放松对可访问的相应构造函数的规则。

如果你觉得你绝对想要一个复制构造函数,你可以强制复制构造,例如,通过一个恒等函数传递结果:

template <typename T>
T const& identity(T const& object) {
    return object;
}
// ...
    return identity(temp);

通常,您希望省略复制构造函数。

庄元龙
2023-03-14

这称为复制省略:允许在按值返回本地对象时不复制,而是直接在调用者中构造本地对象(您的temp)。即使复制构造函数有副作用,这也是允许的。

 类似资料:
  • 问题内容: 如果我在构造函数中返回一些值或对象,那么var会得到什么? 在两种情况下都会得到什么n? 其实这是一个测验问题,答案是什么? 自定义对象构造函数返回什么? a)新实例化的对象 b)未定义-构造函数不返回值 c)不论return语句是 d)等于return语句是什么;新实例化的对象(如果没有return语句) 问题答案: 我发现了这个很棒的链接: 上面提到的第二点魔术是构造函数返回特定的

  • 可能重复:< br >什么是复制省略和返回值优化? 我有以下程序: 我期望的输出如下: 但我得到以下信息: 问题是:为什么不将对象从func返回到main调用我的复制构造函数?

  • 根据我的理解,当创建了临时对象时,将调用move构造函数。这里,函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:

  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的方法教程。 我最初的想法是,会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示): 但是,正如我已经知道的那样,这是错误的,并且再次将我带到了真正做什么的问题上。我会非常感谢一些形式的解释

  • 问题内容: Java为什么不支持C ++中的复制构造函数? 问题答案: Java。只是没有像在C ++中那样隐式地调用它们,我怀疑这是您的真正问题。 首先,复制构造函数无非是: 现在,C ++将使用以下语句隐式调用复制构造函数: 在这种情况下,克隆/复制在Java中根本没有意义,因为所有b1和b2都是引用,而不是像C 中那样的值对象。在C 中,该语句复制对象的状态。在Java中,它只是复制 引用