使用构造函数从函数返回对象

时间:2017-08-27 14:52:50

标签: c++

示例类:

class myclass
{
  int a;
  int b;

public:
  myclass() {}
  myclass(int x, int y)
  {
    a = x;
    b = y;
  }
};

功能:

myclass function()
{
  return myclass(2, 3);
}

这条线我不明白:

 return myclass(2, 3);

如何返回这样的对象? 看起来像正在使用复制构造函数但构造函数不应该返回任何值? (请使用c ++初学者语言)

4 个答案:

答案 0 :(得分:1)

return语句有specific syntaxcount() 表达式,其中表达式 可转换为函数返回类型

所以return可以转换为返回类型(它是相同的类型)。您也可以使用myclass(2, 3)

从链接中我们也注意到:

  

按价值返还可能涉及建设和复制/移动   临时对象,除非使用copy elision

答案 1 :(得分:1)

声明

return myclass(2, 3);

做两件事:

  1. 首先创建一个临时对象。这就是myclass(2, 3)的作用。它创建一个对象,调用适当的构造函数。

  2. 按值返回临时对象,这意味着它已被复制(或者更有可能将副本省略作为返回值优化的一部分 )。

答案 2 :(得分:0)

myclass(2, 3)是一个表达式,它通过调用myclass构造函数来构造myclass::myclass(int, int)类型的新(临时)对象。

return myclass(2, 3);使用此类表达式的值(新构造的myclass)作为函数function的返回值。这反过来可能会调用复制构造函数将值从构造它的临时位置复制到用于返回值的任何位置(unless RVO kicks in,这在最近的一些C ++标准中应该是强制的)。 p>

答案 3 :(得分:0)

你的问题非常基础,我的第一个建议是从一本好的C ++书开始。

尽管如此,我还是会给你答案。

让我们从return statement开始:

return [expression];

其中:

  

评估表达式,终止当前函数并在隐式转换为函数返回类型后将表达式的结果返回给调用者。

您的陈述

 return myclass(2, 3);

是不同表达式的组合

实际上,表达式myclass(2, 3)将构造一个类型为myclass未命名对象。显然,也会调用构造(为了构造对象)。

你的表达式相当于:

myclass __obj__(2, 3);
return __obj__;

不幸的是,C ++可能非常棘手,因为 myclass(2, 3)可以看起来像一个函数调用,但实际上它构造了一个对象。

从C ++ 11开始,语法越来越丰富,您可以构造一个带括号的对象,如:

myclass{2, 3};  // Create an object myclass invoking constructor(2, 3)
int{3};         // Create an int type with value 3.

所以,以下内容可能不那么模糊:

return myclass{2, 3};  // it definitely creates an unnamed object of myclass