免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2689 | 回复: 4
打印 上一主题 下一主题

[C++] C++函数返回值问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-05 12:48 |只看该作者 |倒序浏览
问题1:
函数按值返回一个类对象时候,如果是形参,为什么还要自我复制一遍?而局部变量就不用
. 写个测试程序:
class X{
public:
  X(int m):s(m){}
  X(const X&;
  ~X(){ cout <<"erase an object,s ="<<s<<endl;}
  X& operator =(const X& );
  int s;
};
X::X(const X & x){
    this->s = x.s+1;
    cout <<"CP fun,s1="<<this->s<<"s2="<<x.s<<endl;}
X::X& X:perator =(const X& x){
    s=x.s;
    cout<<"in an operatot,s1 ="<<this->s<<"s2="<<x.s<<endl;
    return *this;}
X f(X x)
{
  X a(0);   
  cout <<"call a func with para X object\n";
  return x;
}
int main()
{
  X a(1);
  a=f(a);
  cout<<"returned in main()\n";
}
输出:
CP fun,s1=2s2=1
call a func with para X object
CP fun,s1=3s2=2
erase an object,s =0
in an operatot,s1 =3s2=3
erase an object,s =3
erase an object,s =2
returned in main()
erase an object,s =3
为什么在return x之前,还要创建一个拷贝?而且这个拷贝烤完之后立马析构,既然这样为
什么不干脆直接用原来的呢?它们的生存期是一样的吧
问题2:
还是上面那个程序,只main改为
int main()
{
  X a(1);
  X b=f(a);
  cout<<"returned in main()\n";
}
按理说应该调用拷贝构造函数初始化b的,可是结果是:
CP fun,s1=2s2=1
call a func with para X object
CP fun,s1=3s2=2
erase an object,s =0
erase an object,s =2
returned in main()
erase an object,s =3
erase an object,s =1

还有第三个问题...
就是把=的返回值从引用返回改为按值返回.运行结果:
CP fun,s1=2s2=1
call a func with para X object
CP fun,s1=3s2=2
erase an object,s =0
in an operatot,s1 =1s2=3
CP fun,s1=4s2=3
erase an object,s =4
erase an object,s =3
erase an object,s =2
returned in main()
erase an object,s =3
可见return *this;前又拷贝了一个临时对象,但是它立马被析构,并且返回的还是旧值.这又何必创建呢?


请大家帮我看看吧,谢谢了!!!!

论坛徽章:
0
2 [报告]
发表于 2009-05-05 12:58 |只看该作者
1. 本身传递进来的x就已经是一个临时拷贝了,不可能“它们的生存期是一样的吧”,你看第一条输出。
2. 这种形式的叫做直接初始化,不调用copy ctor
3. 返回引用,这个临时对象就不会被创建。

C++中,传参和返回都是按照“值”的方式进行。传参时会在栈上拷贝一份留给所调函数使用。返回时会把栈上返回值考一份给调用方用。因为被调用函数的栈在调用结束后就不存在了。

论坛徽章:
0
3 [报告]
发表于 2009-05-05 14:31 |只看该作者
原帖由 fera 于 2009-5-5 12:58 发表
1. 本身传递进来的x就已经是一个临时拷贝了,不可能“它们的生存期是一样的吧”,你看第一条输出。
2. 这种形式的叫做直接初始化,不调用copy ctor
3. 返回引用,这个临时对象就不会被创建。

C++中,传参和 ...


1.我是说x和返回前新创建的临时对象,它们生存期一样,都是在f中创建,返回main消亡的啊
2.就算是直接初始化这里,为什么连构造函数都不调用了?
3.我知道就不会产生了,所以这里才刻意去掉,去观察这个产生的临时对象.可是返回的并不是这个临时对象,所以不知道创建它的意义何在

论坛徽章:
0
4 [报告]
发表于 2009-05-05 17:10 |只看该作者
结了..
NRV优化..

论坛徽章:
0
5 [报告]
发表于 2009-05-05 18:01 |只看该作者
原帖由 lknh17 于 2009-5-5 17:10 发表
结了..
NRV优化..

无法说你是对还是错。
但是,1. 调用的是f,我说的栈是f的栈
2. 你试试看有没有调用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP