免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: andy_hqj
打印 上一主题 下一主题

[C++] 成员函数返回对象还是引用 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-11-07 17:05 |只看该作者
本帖最后由 andy_hqj 于 2013-11-07 17:06 编辑

回复 10# myworkstation

我用的是g++编译器,我也是按你分析想的,他提示的错误应该是返回临时变量的时候会调用拷贝构造函数,可是我拷贝构造函数中的打印并没有看到;

同时感谢耐心解答,让我明白不少。

另外函数返回值如果是自定义类的临时对象的值,如果要接收是必须用const引用吗?这样这个空间就不会立即释放?





   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
12 [报告]
发表于 2013-11-07 22:03 |只看该作者
回复 11# andy_hqj


    必须是const引用,因为临时变量是个rvalue,只能赋值给const引用。但是const并不决定对象的生命周期,什么时候释放空间和这个没有关系。

论坛徽章:
0
13 [报告]
发表于 2013-11-08 12:20 |只看该作者

论坛徽章:
0
14 [报告]
发表于 2013-11-10 14:44 |只看该作者
回复 12# myworkstation

再请教一下
class A
{
        int a;
public:
        A():a(0){cout<<"A()"<<endl;};
        A(int b):a(b){cout<<"A(int b)"<<endl;};
        A(const A &b){a = b.a;cout<<"A(const A &b)"<<endl;}
        ~A(){cout<<"~A()"<<endl;}
};

int main()
{
        A x = A(5);
        return 0;
}

这个输出是:
A(int b)
~A()

我觉得这个过程应该是会实例化两个对象,为什么构造和析构都只调用了一次,也就是为什么只实例化了一个?
过程不应该是A(5)构造一个临时变量,最后调用拷贝构造函数再构造一个吗?


   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
15 [报告]
发表于 2013-11-10 15:19 |只看该作者
回复 14# andy_hqj


    这是因为RVO(返回值优化)起作用了。实际只创建了一个对象,避免了临时对象的产生。

论坛徽章:
0
16 [报告]
发表于 2013-11-10 23:24 |只看该作者
回复 10# myworkstation
"改成String& String:: operator+( const String& s )这样的原型"

这样,这个函数应该如何返回值? 又不能返回*this 也不能返回s。。。。
看不明白了呢?


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP