匿名对象不需要对象名,直接通过类名创建对象
假设现在有一个Person类
我们使用这个类创建一个匿名对象,如下:
Person(); //匿名对象
这里主要学习的是匿名对象的特性和应用场景
目录
1、匿名对象的生命周期仅仅只是当前行
匿名对象的生命周期仅仅只是 匿名对象所在行,但是匿名对象毕竟也是对象,创建对象时,调用构造函数;对象生命周期到了,会调用析构函数
我们通过调试来验证这个特性,一开始是没有任何反应的
走到下一行的时候,我们发现构造函数和析构函数被调用了
2、单参构造函数场景下的匿名对象
对于单参的构造函数,C++支持通过 等号(=) 来初始化,这个时候存在隐式转换
我们稍微修改一下Person类
我们可以稍微观察右边这个图,实际上这两种写法是等价的,第一种是常规写法,第二种发生了隐式转换
Person p1 = 20; //编译时会变成 Person p1 = Person(20);
(1) 20 先转换成隐式匿名对象 Person(20)
(2) 由于外面有对象在等待被实例化,匿名对象Person(20) 会直接转化成 p1
此时匿名对象的生命周期便不再是当前行了,由于转化成了普通对象,生命周期就和普通对象一样
3、函数形参 使用匿名对象作为缺省值
这种情况在模板中比较常见,在不确定对象的数据类型时,可以使用匿名对象作为缺省值
template<class T>
void Push(const T& x = T())
{
}
使用 &:减少拷贝
使用 const:引用变量x 绑定一个匿名对象时,由于匿名对象T() 作为一个临时变量具有常性,所以要求引用变量x 必须是const类型