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那个跟好一些
例如
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函数内部,只做成员变量的存取。
现在,你的问题已经很清楚了,在上述情况下将对象作为输出参数性能较作为函数返回值时高。
希望对你有所帮助,呵呵 。
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28