引用 临时对象 生命期 引用和对象之间到底是什么关系? 有代码演示. 谢谢
class Ctemp
{
public:
int k;
public:
Ctemp(int ik = 29)
{
k = ik;
//cout < <k < <endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
const int &iref = 30;
cout < <iref < <endl;
cout < <iref < <endl;
const Ctemp & t = Ctemp(29);
cout < <t.k < <endl;
Ctemp *pt = new Ctemp(19);
const Ctemp &reftem = *pt;
cout < <reftem.k < <endl;
delete pt;
cout < <reftem.k < <endl;
cout < <t.k < <endl;
return 0;
}
输出结果:
30
30
29
19
-572662307
29
Press any key to continue
哪个给解释下 :为什么是:-572662307 而不是19,如果说引用的对象释放了
所以是-572662307(释放掉内存中的数据),那为什么引用临时对象那个输出还是
29。临时对象在const Ctemp & t = Ctemp(29);之后就会调用析构函数销毁改对象啊。有证据如下:
临时匿名对象的生存期被定在一句语句的结束。也就是到了下一行语句之前,临时匿名对象被销毁。关于这个生存期的问题标准委员会有过长时间的争论,最终确定这个方案。理由差不多是:有一个方案比没有这个方案强。(来自别人发的贴子中 longshanks(longshanks) 的回答。帖子:http://community.csdn.net/Expert/topic/5494/5494160.xml?temp=.6641352)
哪个给解释下
谢谢
[解决办法]
const Ctemp & t = Ctemp(29);
你问这个啊,
只能怪你看书不仔细了
C++规定,临时对象如果绑定给一个const引用的话,这个临时对象的生存期将加长到和那个引用相同。
建议你找 <C++ Primer> 认真学学。
[解决办法]
const Ctemp & t = Ctemp(29); // 这里创建一个匿名对象
const Ctemp &reftem = *pt; // 这里为同一物
delete pt; // 释放自然没有了,不错仅仅是内存回收
cout < <t.k < <endl; // t和reftem有什么关系吗
[解决办法]
很正确啊!
Ctemp *pt = new Ctemp(19);
const Ctemp &reftem = *pt;
reftem 仅仅是 *pt 的别名!pt都delete掉了,reftem自然就不存在指向垃圾了
至于t,已经是对象Ctemp(29),加不加&仅仅是通过构造函数还是复制构造函数生成而已。他的生命期与main函数相同,没什么可奇怪的,倒是taodm的解释看上去怪怪的,看来还要taodm自己来解释了。
[解决办法]
相信指针释放掉,之后输出随机数这块楼主已经明白了
不明白的是为什么那个临时对象没有被释放掉而使常引用成为随机数。
等待详解
[解决办法]
匿名对象和临时变量就是同义词。
[解决办法]
是临时对象生命期延长的问题。
taodm就是牛,
我翻了书,在c++标准白皮书书(2003SE),第十二章第二节第5条上P192上有详细例子
const C& cr = C(16)+C(23);
the expression C(16)+C(23) creates three temporaries
A first temporary T1 to hold the result of the
expression C(16), a second temporary T2 to hold the result of the expression C(23), and a third temporary T3 to hold the result of the addition of these two expressions. The temporary T3 is then bound to the
reference cr
The temporaries T1 and T2 are bound to
the reference parameters of operator+; these temporaries are destroyed at the end of the full expression
containing the call to operator+. The temporary T3 bound to the reference cr is destroyed at the end of cr 's lifetim
[解决办法]
to:taodm
匿名对象和临时变量就是同义词。
-------------------------
这点我不能认同,我认为匿名对象与临时变量相似但是两回事。临时变量是指中间变量,一种仅在其调度区域有定义的一种变量,对外可能存在调用形式也可能并不存在,比方说:
class A;
A a,b;
...
A c = a+b;//这里将产生临时变量而不是匿名变量
临时变量不存在实名化问题,其值只能被复制而不能被引用,上面的例子将引发复制构造函数
但匿名变量则不同,首先其存在区域是在其声明的程序块内,其二,其可以通过引用的方式实名化。因此匿名变量与临时变量应该是两种不同的变量。
[解决办法]
to FreeFice(庄鱼)
你吃火药了?
请你态度好一些,大家都是在讨论问题,你也不是天生就会的吧?
[解决办法]
我同意taodm的说法,匿名变量就是临时变量,不信的同志动手试试,单靠嘴说,又不是开辩论会
class A
{
public:
~A(){printf( "~A\n ");}
};
int main()
{
A();
A a;
getchar();
return 0;
}
运行的时候,直接打印出~A,按下回车,才再打印另一个~A
说明什么,自己研究吧
[解决办法]
const A &c = a+b;//----这里并不是引用了临时变量,而是调用了复制构造函数。
由于A c=a+b都会调用复制构造函数,因此这问题很容易被掩盖。
这点就同匿名构造一样,为什么不使用临时构造而采用匿名构造,就在于匿名构造的作用域有可能随变量也有可能随函数也可能随类型作用域,但是临时构造就仅限于声明的那一刻了(基本没啥用处)。
匿名变量用处很广,通常最常见的就是用于变量初始化及充作临时变量,但临时变量的作用域要小于匿名变量。
楼上的,你的例子并没有说明什么。
[解决办法]
struct A
{
A(){cout < < "In this ";}
A(const A &){cout < < "Here ";}
};
A operator+(const A & x, const A & y){return A();}
int main(int argc, char * argv[])
{
A a, b;
const A & c = a + b;
system( "pause ");
return 0;
}
[解决办法]
FreeFice(庄鱼)你还说别人看代码不仔细,你不也是嘛,
我的代码里
int main()
{
A(); //这是不是一个匿名对象?如果承认,那么它在执行完这条语句就析构了,说明它
A a; //也就是一个临时对象,所以得证匿名对象=临时对象
getchar();
return 0;
}
[解决办法]
Ctemp & t = Ctemp(29); 这句应该编译出错或者至少给出warning。