返回临时变量的修改

kgraphics 2009-02-28 11:24:04

QVertex3d Center()
{
QVertex3d center;
center.m_Coord[0] = 0.5*(pMax.m_Coord[0]+pMin.m_Coord[0]);
center.m_Coord[1] = 0.5*(pMax.m_Coord[1]+pMin.m_Coord[1]);
center.m_Coord[2] = 0.5*(pMax.m_Coord[2]+pMin.m_Coord[2]);
return center;
}


以上是代码,但是知道不对,原因是center是临时变量,请问正确该如何写呢?
...全文
144 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgwhugr0216 2010-01-02
  • 打赏
  • 举报
回复
只要拷贝构造函数没有被定义为private,就没问题。
太乙 2009-02-28
  • 打赏
  • 举报
回复
其实,你得看你的QVertex3d 是个啥东西?类么?

做法有以下:

一、用指针:QVertex3d *pQ = new QVertex3d;这样,返回一个指针,因为new出来的内存在堆上。所以不会释放内存,自己在外自动释放

二、用全局:这种方法不好,毕竟,破坏了封装性。不推荐

三、作为参数传递:可以传递引用、也可以传递指针。

四、局部静态变量:这应该行不通、因为,这是局部的,在外访问的话,访问不了!

五、在调用的时候处理:这个需要QVertex3d 的拷贝构造函数,或者说是构造函数:比如:QVertex3d q(Center())、或者QVertex3d q = Center()

……
lingyin55 2009-02-28
  • 打赏
  • 举报
回复
局部变量出了函数作用域就释放了,怎么还能返回呢,up 2楼,传递一个参数进去吧

[Quote=引用楼主 kgraphics 的帖子:]
C/C++ code
QVertex3d Center()
{
QVertex3d center;
center.m_Coord[0] = 0.5*(pMax.m_Coord[0]+pMin.m_Coord[0]);
center.m_Coord[1] = 0.5*(pMax.m_Coord[1]+pMin.m_Coord[1]);
center.m_Coord[2] = 0.5*(pMax.m_Coord[2]+pMin.m_Coord[2]);
return center;
}




以上是代码,但是知道不对,原因是center是临时变量,请问正确该如何写呢?
[/Quote]
jiahehao 2009-02-28
  • 打赏
  • 举报
回复
或者传个实参进来也行呀。在函数体内把值赋给实参。
oyljerry 2009-02-28
  • 打赏
  • 举报
回复
返回临时对象,会发生对象拷贝,
ct = Center();
hmsuccess 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
汗,肯定不行啊,center变量出了该函数的作用域就析构了。返回也是白返回啊。
2种办法,:
1.把QVertex3d center;定义放到全局。
2.static QVertex3d center; 声明为静态变量。

[/Quote]
up
  • 打赏
  • 举报
回复
又想了想,如果把QVertex3d center在全局声明的话。。就没必要返回了,标准的做法是输入形参。

QVertex3d Center(QVertex3d ¢er) //实参可以是外部的非全局变量
{
center.m_Coord[0] = 0.5*(pMax.m_Coord[0]+pMin.m_Coord[0]);
center.m_Coord[1] = 0.5*(pMax.m_Coord[1]+pMin.m_Coord[1]);
center.m_Coord[2] = 0.5*(pMax.m_Coord[2]+pMin.m_Coord[2]);
return center;
}


  • 打赏
  • 举报
回复
汗,肯定不行啊,center变量出了该函数的作用域就析构了。返回也是白返回啊。
2种办法,:
1.把QVertex3d center;定义放到全局。
2.static QVertex3d center; 声明为静态变量。
tangshuiling 2009-02-28
  • 打赏
  • 举报
回复

如果copy构造函数没有问题,完全可以返回一个局部对象的副本。
只不过增加了调用的开销,影响执行效率,除此别无他碍
局部对象离开了作用域,但它在牺牲之前把自己的一切属性都传给了副本(一种所有属性的传承)
zfvc1986911 2009-02-28
  • 打赏
  • 举报
回复
你这个就没错,四楼说的对啊,就是隔效率问题!
zenny_chen 2009-02-28
  • 打赏
  • 举报
回复
呵呵,像这么一个简单的函数,如果打开编译器优化的话肯定会被内联的。那是就仅仅是可能不存在拷贝操作了。
而且QVertex3d基本上就是个结构体,用起来也不复杂,所以也没必要考虑什么拷贝构造函数之类的东东。
如果是对象赋值的话也就是做字节拷贝。
顺便说一下,上面的那个操作在x86平台上(Pentium4或更高端的PC)可以用PAVGB或PAVGW进行优化解决。
chin_chen 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
返回临时对象,会发生对象拷贝,
ct = Center();
[/Quote]
在g++下 可不是你说的这样。
wjb_yd 2009-02-28
  • 打赏
  • 举报
回复
no problem
fairchild811 2009-02-28
  • 打赏
  • 举报
回复
应该没有问题吧,只是不能返回他的引用,如果是返回对象,会自动拷贝的.
danxuezx 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhkefa 的回复:]
引用 4 楼 oyljerry 的回复:
返回临时对象,会发生对象拷贝,
ct = Center();


只要拷贝函数没问题,就不会错,剩下的是效率问题。。
[/Quote]
楼下的朋友扫下盲,“返回临时对象,会发生对象拷贝”是什么意思?
rgmlkthh 2009-02-28
  • 打赏
  • 举报
回复
传参数吧。
arong1234 2009-02-28
  • 打赏
  • 举报
回复
不能返回“临时变量”这种说法是错误的,当你返回临时变量自己是,在返回过程种会构造临时变量,调用者得到的实际是你那个临时变量的拷贝,其实是没有问题的。(前题是你的拷贝构造函数得对)


我们不能返回的是“临时变量的指针或者引用”,这两种情况下,你的调用者还会试图去访问那个临时变量,这才是有问题的。
zhkefa 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
返回临时对象,会发生对象拷贝,
ct = Center();
[/Quote]

只要拷贝函数没问题,就不会错,剩下的是效率问题。。
stock888 2009-02-28
  • 打赏
  • 举报
回复
传参数,引用~
mabo321 2009-02-28
  • 打赏
  • 举报
回复
四、局部静态变量:这应该行不通、因为,这是局部的,在外访问的话,访问不了????
==============================================================
这样可以啊!!

QVertex3d Center()
{
static QVertex3d center;
center.m_Coord[0] = 0.5*(pMax.m_Coord[0]+pMin.m_Coord[0]);
center.m_Coord[1] = 0.5*(pMax.m_Coord[1]+pMin.m_Coord[1]);
center.m_Coord[2] = 0.5*(pMax.m_Coord[2]+pMin.m_Coord[2]);
return center;
}

还是建议在堆区弄

QVertex3d * Center()
{
QVertex3d *center = new QVertex3d();
center->m_Coord[0] = 0.5*(pMax.m_Coord[0]+pMin.m_Coord[0]);
center->m_Coord[1] = 0.5*(pMax.m_Coord[1]+pMin.m_Coord[1]);
center->m_Coord[2] = 0.5*(pMax.m_Coord[2]+pMin.m_Coord[2]);
return center;
}

用完后在外边delete
加载更多回复(1)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧