首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于返回值临时对象的有关问题

2012-02-13 
关于返回值临时对象的问题classbase;basefunc(basebs){returnbs}basebs,bs1bs1func(bs)func函数是返回

关于返回值临时对象的问题
class   base;
base   func(base   bs)
{
      return   bs;
}
base   bs,bs1;
bs1=func(bs);
func函数是返回一个base对象,那么在返回时将生成一个临时对象,并把这个临时变量赋值给bs1,这个临时对象在函数返回以后肯定是存在的,我想知道那这个临时变量存在什么地方,为什么bs1=func(bs);这句一执行完临时对象就析构了,那个高手给解释意思啊。

[解决办法]
“临时变量存在什么地方”,基本上你可以认为在栈里。
“为什么bs1=func(bs);这句一执行完临时对象就析构了”,因为C++标准就这么规定的。
[解决办法]
==================================================================================
我想知道的是这个临时对象存在那里,应该不是被调用的函数栈内吧, 因为这样的话函数返回时肯定就被析构了,bs1=func(bs)这句也就不能正确的赋值了,是不是这个临时对象存在主调函数的栈内呢???
====================================================================================
base func(base bs)
{
return bs;
}
这个函数返回时构造的临时对象不是在func函数的栈内,而是在调用这个函数的函数的栈内。
int main()
{
base bs;
func(bs);

return 0;
}
比如在这个main()函数中,会生成一个你看不到的临时变量用来保存func函数返回值,但是这个返回值在这条语句结束后,马上就被析构.

而这样:
base b=func(bs);
func返回值填入临时变量将后,再从临时变量复制给变量b,然后析构临时变量

而这样:
base &b=func(bs);
func返回值填入临时变量后,将临时变量的引用赋给变量b,由于有一个引用指向了这个临时变量,就不会再析构这个临时变量,从而延长了这个临时变量的生命周期。

再来一个:
base *b=func(bs);
func返回值填入临时变量后,将临时变量的指针赋给变量b,但这时候与引用不同,临时变量仍然会被析构,临时变量的生命期结束,b指向了一个已经被析构的对象,危险。

另外,好像对于新的C++标准,需要一个const类型的引用才能指向临时对象,这样
const base &b=func(bs);
不过这个就不太确定,想到了就写出来,希望不会误导大家

热点排行