+ -
当前位置:首页 → 问答吧 → C++面向对象编程

C++面向对象编程

时间:2011-12-26

来源:互联网

当一个函数需要返回一个对象时,选择返回对象,还是利用参数返回。那个更加效率。

例如

class Test
{
public:
Test():mvalue(0){};
Test(const& rhs){mvalue = rhs.mvalue;};

private:
int mvalue;
}


Test foo();
void foo(Test& test);

上面的两个foo那个跟好一些

作者: vichal   发布时间: 2011-12-26

我理解都是一样的

作者: bmowker   发布时间: 2011-12-26

效率的话 是第二种

作者: classpatterns   发布时间: 2011-12-26

第二个更有效率一些,但是更加麻烦,如果这个对象的复制构造不是重量级的就应该考虑用第一种

作者: mingliang1212   发布时间: 2011-12-26

如果对象体积不大的话都差不多,第一种要实现拷贝构造函数,第二种是引用参数,不是把函数体内的对象带出来,而是吧函数体内的对象拷贝到参数的对象中来~

作者: mscf   发布时间: 2011-12-26

首先纠正一下你定义类Test中的错误
class Test
{
public:
  Test():mvalue(0){};
  /*Test(const& rhs){mvalue = rhs.mvalue;};*/
  Test(const Test& rhs)
  {
  mvalue = rhs.mvalue;
  }

private://后面的讲解,基于mvalue为public,否则要提供一个访问成员变量mvalue的接口
  int mvalue;
};//注意'}'后面的';'


然后,你的问题是在函数中将对象作为函数返回值和作为输出参数之性能比较:
首先我们看将对象作为函数返回值,例如oper函数
Test oper()
{
  Test test;
  test.mvalue = ...;
  return test;
}
这种情况下,在函数内部够早了Test类对象test,但是在执行return test语句时,由于test的作用范围仅在{和}之内,编译器会构造一个临时对象(temporary object),然后调用拷贝构造将test完整复制一份给临时对象,总的个来说,在执行这个函数时构造了两次对象。

然后我们看将对象作为输出参数,例如
void oper(Test &test)
{
  test.mvalue = ...;
}
Test test;
oper(test);
在执行oper函数之前,构造了一次对象,在oper函数内部,只做成员变量的存取。

现在,你的问题已经很清楚了,在上述情况下将对象作为输出参数性能较作为函数返回值时高。

希望对你有所帮助,呵呵 。

作者: ArvonZhang   发布时间: 2011-12-26