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

解析局部对象与临时对象

2016-07-27 11:06 363 查看
http://blog.csdn.net/lujiandong1/article/details/42195595

没有名字的对象就是临时对象,它存在于完整的表达式的生存其间。也就是说,当表达式计算结束后就会被释放。一个例外是,当临时对象被引用时,它的生存期将延长到与这个引用的生存期一样长

局部对象就是可见区域在一个函数范围的对象。
局部对象有两种,静态局部对象的生存期起于所在函数第一次被调用,结束于main()函数退出之后自动局部对象生存期起于所在函数每一次被调用,结束于函数返回。
A fun()
{
return A();//创建一个A的临时对象并返回。这个临时对象将被拷贝给调用者的临时对象,然
后释放(在进行了RVO时不创建临时对象,而是直接构造调用者的临时对象)。
}

A a;
a = fun();//调用fun,产生一个临时对象;用这个临时对象为参数调用a的拷贝赋值操作符,然释放临时对象

const A b& = fun();//调用fun,产生一个临时对象,这个对象并不会马上被释放,而是会在离开b的作用域后释放,因为它被b引用了

临时对象

临时对象是看不见的,不出现在源代码中。通常两种条件下会产生:

1为了使函数成功调用而进行的隐式类型转换

2 函数返回对象时
在任何时候只要见到常量引用(reference to const)参数,就存在建立临时对象而绑定在参数上的可能性

任何时候只要见到函数返回对象,就会有一个临时对象被建立

局部对象

静态局部对象:在首次进入到定义该静态对象的函数时,进行构造,存放在全局数据区,其生命期与程序的运行生命期相同。

局部对象:在函数开始执行时,按出现的顺序统一定义,存放在栈中,其生命期同函数的生命期。

 class A  { -----}

     A get ()  {  A a;  

                return a;

                };
对象a分配在栈中函数返回时已经析构是不可返回的。因此需要创建“临时对象”。

2.在函数的调用者接收了函数返回的“临时对象”时,如果是作为引用接收的,此时该“临时对象”即转变为“永久对象”不再析构。如果是作为非引用接收,则c++将再创建一个copy对象copy这一“临时对象”,然后将该“临时对象”析构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cc++