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系统下,生成的临时对象在栈中总是占据着比其它局部变量更低的内存地址空间,即更接近于栈顶。
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系统下,生成的临时对象在栈中总是占据着比其它局部变量更低的内存地址空间,即更接近于栈顶。
相关文章推荐
- C++中的临时对象,对临时对象的引用,和临时对象的指针
- c++将临时对象赋值给引用和指针的不同
- 再探C++Primer (4)指针、引用、对象和内存
- C++的引用计数j控制智能指针——>Java的引用计数管理共享对象
- C++多态必须使用指针或者引用,直接传对象就变成切片
- C++中const修饰基本数据类型、指针、引用、对象
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- C++对象引用和this指针用法
- C++引用、对象、和指针的区别
- c++ 对象指针参数和对象引用参数02
- C++新特性(类与对象的各种指针和引用)
- c++;对象引用前加const报错:不能将“this”指针从“const a”转换为“a &”
- c++ 非常量引用产生临时对象
- 关于C++中父类指针引用对象在内存中的分布
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
- C++指针、引用传参操作对象----测试
- C++:向函数传递对象(对象、对象指针、对象引用)
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题