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

"引用"可以指向临时对象吗?该如何处理

2012-02-26 
引用可以指向临时对象吗?classAAfunc()constA&reffunc()按照我的理解,函数返回的对象是一个临时对象

"引用"可以指向临时对象吗?
class   A;
A   func();
const   A   &ref=func();

按照我的理解,函数返回的对象是一个临时对象,表达式计算完后会被删除。这样的话,引用ref会指向一个临时对象,会有问题吗?

[解决办法]
去看《C++ Primer》,有明确解答。
临时变量被const引用绑定后,生命期就将自动延长到好这个引用同长。
[解决办法]
按LZ的意思,func()不需要返回引用类型,直接返回值类型就可以了。

如果返回值类型,那么

表达式左边是非const引用,会有问题。记不太清了,好像编译器会报错,说不可以引用到临时变量上。

如果是const引用,看taodm说的吧。
[解决办法]
class A;
A func();
const A &ref=func();

这种情况下,ref 会一直有效到ref消失

***

class A;
A& func();
const A &ref=func();

这种情况,完蛋,返回内部地址
[解决办法]
在 < <the c++ programming language> > 和 < <C++必知必会> > 里有关于const引用作用在临时对象之后的解释,primer里好像没看到过.
[解决办法]
在 const A& ref(fun()); 中,注意fun()返回 A 和返回 A& 的不同。
如果返回的是A ,那么 const A& 引用保证这个返回的临时A对象的生存期延长到引用本身结束。如果返回的是 A&,那么就没有这个保证了。因为用 A& 初始化 const A& 并不涉及上述引用对其所引用临时对象的生存期保护条款(注意A&不是const A&所引用的对象,即使A&引用了一个临时对象,对const A& 也再不适合该条款;况且A&引用一个局部对象,就更不适合了)。因此,当这个初始化完成后,返回值 A& 和它所引用的局部A对象的生存期都结束了,局部A对象可以被析构,此时const A& 所引用的就是已析构的对象了,其行为是未定义的。
[解决办法]
taodm((不能收CSDN社区短信息,请莫浪费精力)) 正确,const的引用可以绑定到临时对象,具体在C++ primer上哪说过已经忘了,但肯定有。

还有这样一个例子:
double a=1.0;
int &ra =a; //error:将一个double绑定到一个int引用

const int &c_ra=a; //OK:这里将生成一个临时的未具名的int对象,
//将这个临时对象绑定到const引用是可以的

其实可以等效于下面这几句来理解:
double a=1.0;
int temporery = a; //这是一个临时的int对象
const int &c_ra = temporary; //将c_ra绑定到临时对象,临时对象生命其延长。
int &ra=temporary; //错误:非常量引用不能绑定到临时对象。

关于这个问题在这个板块已经有过很多讨论了,楼主可以搜索一下看看。

还有就是对于VC6.0好像非常量的引用也能绑定到临时对象,但C++标准应该不允许这样
[解决办法]
按照你的问,可设有如下类及函数:

class A
{
long _la;
public:

A(){_la = 9;}
~A()
{
cout < < "析构 " < < endl;
}
void show(void) const
{
cout < < "@: " < < _la < < endl;
}
};

A func(void)
{
A a;//局部变量;
return a;//以a考贝建构临时对象,假定名为_a_temp!

//a的生命期在这儿终止,你将看到函数结束后,析构a!
}

//这个宏有利我们观察演示情况:
#define _PAUSE cout < < "暂停,按任意键... " < < endl;\
getche();

//可调试跟踪如下main()函数
void main()
{
{
const A &ref=func();
ref.show(); //这个函数演示出引用的临时变量仍具生命力!
_PAUSE;
//ref引用变量的生命期终止,ref引用的临时对象在这儿析构!
}
_PAUSE;
}
执行上述程序,你将在 'ref.show(); '语句执行前看func中局部变量a的析构,
其次,执行ref.show()语句,这个语句演示出引用的临时变量仍具生命力!
再次,在上面的两个_PAUSE语句之间,你会看到临时对象的析构动作!

上述演示程序可以证明,ref绑定的临时对象并未随其生命期的结束(func的最后一个右括号)而析构,而是在ref的生命期结束后才析构。

C++标准规定: "如果一个临时性对象被绑定于一个引用,对象将残留,直到被初始化之引用的生命期结束 "(见《Inside The C++ Object Model》page275) 

热点排行