c++中的临时量和对象的生存周期
《一》临时量的生成:
1.内置临时量:相当于一个常量 在存储器中存放
2.自定义类型:相当于产生一个变量临时量 在内存中存放
3.隐式生成临时量:相当于一个常量(const类型)不能用普通的引用来引用。例如赋值运算符重载函数的形参
4:显示生成临时对象:相当于生成了一个变量,可以用普通的引用来引用
《二》返回值
1、其他类型:
- <=4字节 由eax寄存器带回
- >4 <=8字节 由 eax edx寄存器带回
- >8 字节 产生临时量
2、类类型:不管是几个字节 都是临时对象带回来
《三》返回对象
1、接收一个返回对象的返回值时,在定义的时候直接接收返回值,是初始化的过程并非赋值
《四》实参传递形参
实参传递形参的过程是初始化的过程,调用拷贝构造函数
《五》对象的生存周期
优化:如果(显示或隐式)生成一个临时对象是为了生成新的对象,那么就会以生成临时对象的方式来生成新的对象(不会产生临时对象)。
无优化:如果(显示或隐式)生成一个临时对象是为了给已经生成的对象赋值,那么就会有临时对象的产生。
一句一句分析代码:
(1:全局对象先生成)
- good1对象先生成,它是一个全局对象,它的生存周期是从它生成开始到整个程序结束
- 其次good2对象生成,它是一个全局对象,它的生存周期是从它生成开始到整个程序结束
(2:局部对象的生成)
- Good3对象生成(调用默认的构造函数),它的生存周期是从生成开始到return语句结束
- Good4对象生成(调用构造函数),它的生存周期是从生成开始到return语句结束
- Good5对象生成(调用拷贝构造函数),它的生存周期是从生成开始到return语句结束
- 调用赋值运算符重载函数给用good4给good3对象赋值
- Good6对象生成(调用默认的构造函数),它是一个被static修饰的对象,(初始化为0)它的生存周期是从生成开始到整个程序结束
- Good7对象生成(用显示生成临时对象的方式生成good7对象,此处有优化,所以并没有生成临时对象 ), 它的生存周期是从生成开始到return语句结束
- 调用带三个参数的构造函数显示生成临时对象(此时生成的临时对象是为了给已生成的对象赋值并不是为了生成新的对象,所以没有优化),然后调用赋值运算符重载函数拿临时对象给good7赋值,good7=Cgoods(“good7”,10.7,7);这条语句结束临时对象被释放。
- Good8对象生成(用隐式生成临时对象的方式生成good8对象,此处有优化,所以并没有生成临时对象 ), 它的生存周期是从生成开始到return语句结束
- 调用带一个参数的构造函数隐式生成临时对象(此时生成的临时对象是为了给已生成的对象赋值并不是为了生成新的对象,所以没有优化),然后调用赋值运算符重载函数给good8赋值,good8=8;这条语句结束临时对象被释放。
- Good9对象生成(用显示生成临时对象的方式生成good9对象,此处有优化,所以并没有生成临时对象 ), 它的生存周期是从生成开始到return语句结束
- 调用带三个参数的构造函数显示生成临时对象(此时生成的临时对象是为了给已生成的对象赋值并不是为了生成新的对象,所以没有优化),然后调用赋值运算符重载函数给good8赋值,good8=(CGoods)(“good9”10.9,9);这条语句结束临时对象被释放。
- 定义了一个Cgoods类型的指针pgood10,显示生成一个临时对象,指针pgood10指向这个临时对象,pgood10的生存周期是从生成开始到return语句结束,显示生成的临时对象在Cgoods*pgood10=&CGoods(“good10”10.1,10);
- 这条语句结束后临时对象被释放,此时指针pgood10就会成为一个野指针。(指针并不会提升临时对象的生存周期)
- 定义了一个Cgoods类型的引用pgood11,显示生成一个临时对象,指针pgood11指向这个临时对象,pgood11的生存周期是从生成开始到return语句结束,显示生成的临时对象和pgood11这个引用的生存周期一样,(引用会提升临时对象的生存周期)
- 定义了一个Cgoods类型的指针pgood12,指向一片堆内存,并且这片堆内存已经被初始化,指针pgood12的生存周期是从定义点开始,直到delete才被释放
- agood13是一个数组,数组里面有两个Cgoods对象,它的生存周期是从定义点开始到return语句结束,
- return 0;这条语句结束释放所有的栈区空间(临时变量,除过static修饰的变量),}结束释放全局区所有资源