在学习C++的过程中,经常遇到这样几个概念:临时对象,局部变量,栈上对象等等,相信有不少人对此的理解是有点模糊的,只知其一不知其二。刚刚自己悟到了这个点,来说明一下。
1.临时对象、栈上对象
以一个示例引入:
//代码1
Point3D convert(Point2D & d2)
{
return Point3D(d2); //Point3D(d2)为一个临时对象,将其返回
}
该函数返回一个临时对象,临时对象在哪里呢?是不是在栈上呢?
在我的学习中,是这样的:临时对象,通常是不可以取地址的对象,即CPU中计算产生的中间变量,通常称为右值。常见的临时对象有常量,表达式,函数返回值,等等。
同时有一种专门创建临时对象的写法,格式:类型(值);,如int(5);,A(10);//这里的A为一个类。
临时对象,创建在CPU寄存器上,不会在内存中占空间,因而也不能够取地址(只有内存才有地址编址)。所以临时对象并不是栈上对象——临时对象存在CPU寄存器中,怎么可能跑到栈区呢!
那么上面的代码如何理解呢?不妨再看一个类似的代码:
//代码2
Complex operator+(const Complex & one,const Complex & another)
{
Complex sum; //栈上对象
sum.real = one.real + another.real;
sum.image = one.image + anther.image;
return sum; //栈上对象可以返回,但不能返回其引用
}
在C++学习过程中,需要铭记的一个知识点是:可以返回栈上对象,但是不可以返回栈上对象的引用。因为引用是和空间相关联的,栈上对象空间的特点是随用随开,用完即消。<