关于返回值临时对象的问题
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);
不过这个就不太确定,想到了就写出来,希望不会误导大家