有时候在求表达式求值期间,编译器必须创建临时对象。像其他任何对象一样,临时对象也需要存储空间,并且必须能够构造和销毁。
临时量的生成:
内置类型 ------>相当于常量(在C++中,常量必须初始化,指针类型都是内置类型)
自定义内型----->相当于变量
.隐式生成临时量:相当于一个常量(const类型)不能用普通的引用来引用。例如赋值运算符重载函数的形参
显示生成临时对象:相当于生成了一个变量,可以用普通的引用来引用
返回类型:
返回值大于0小于等于4字节:使用一个寄存器带回 。如:eax寄存器
返回值大于4小于等于8字节:使用两个寄存器带回.。如:eax,ebx寄存器
返回值大于8个字节: 临时量带出
类类型不管是几个字节都由临时对象带出返回值,临时对象在内存中。
实参传递形参:
实参传递形参的过程就是初始化的过程,要调用拷贝构造
返回对象:
接收一个返回对象的返回值时,在定义的时候直接接收返回值,是初始化的过程并非赋值
对象的生存周期
优化:如果(显示或隐式)生成一个临时对象是为了生成新的对象,那么就会以生成临时对象的方式来生成新的对象(不会产生临时对象)。
无优化:如果(显示或隐式)生成一个临时对象是为了给已经生成的对象赋值,那么就会有临时对象的产生。
#include<iostream>
class Test
{
public:
Test(int a, int b)
{
std::cout << this << " :Test::Test(int,int)" << std::endl;
ma = a;
mb = b;
}
Test(int a)
{
std::cout << this << " :Test::Test(int)" << std::endl;
ma = a;
mb = 0;
}
Test()
{
std::cout << this << " :Test::Test()" << std::endl;
ma = mb = 0;
}
Test(const Test& rhs)
{
std::cout << this << " :Test::Test(const Test&)" << std::endl;
ma = rhs.ma;
mb = rhs.mb;
}
Test& operator=(const Test& rhs)
{
std::cout << this << " :Test::operator=(const Test&)" << std::endl;
if (this != &rhs)
{
ma = rhs.ma;
mb = rhs.mb;
}
return *this;
}
~Te