您的位置:首页 > 编程语言 > C语言/C++

C++中的临时对象,对临时对象的引用,和临时对象的指针

2008-03-03 17:18 260 查看
假设有这样一个类:

class TestClass;

现在,如下的表达式,将产生一个临时对象,并在表达式之后立即被销毁:

TestClass();

当然,这看上去有点像调用类TestClass的构造函数。
下面的表达式,定义一了个TestClass的引用,使其指向临时对象:

TestClass& tc=TestClass();

而这时,由TestClass()调用而生成的临时对象却并不会在该表达式结束之后立即被销毁,这个临时对象将会被引用到tc上,在tc的生命周期结束时,这个临时对象才被销毁。
这个特性,常被应用在函数的形参中,如:

void test(const TestClass& tc);
...
test(TestClass());
...

这个参数列表中的临时对象在函数调用时生成,而在函数调用结束时被销毁。

但是,如果不是保留临时对象的引用,而是保存了临时对象的地址,则不会有如上的这些特性,临时对象依然会在表达式结束后,马上自动销毁:

TestClass* ptc=&TestClass();

可是,在这种情况下,如果在如上的表达式之后,使用ptc调用TestClass类的成员函数,依然能够成功,这给人的假象就是对象依然存在,真的是这样吗?
答案是否定的。之所以会有这样的现象发生,是因为系统生成的临时对象在被销毁后,虽然该对象在系统的注册中已经不存在,但是系统并没有因此而改变其原来所占内存空间的数据,这时,在临时对象的指针所指的内存区域中,数据并没有被改变,因此,对其成员的调用依然能够显示出正确的结果,而且在当前有可能相当长的作用域范围之内,这种调用看上去都是正确的,而一旦逃离这个作用域后,这些数据就将不复存在了,这时再使用ptc进行对非静态成员的操作,将不再是我们希望看到的结果。注意,是[非静态成员],如果是静态成员,操作依然有效。

另外,在我的VC6+WinXP系统下,生成的临时对象在栈中总是占据着比其它局部变量更低的内存地址空间,即更接近于栈顶。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: