0. 前言
本节内容属于拓展,需要大家熟练掌握C++匿名对象,和临时变量的相关知识,再来学习。
1. 正文
1. 先来看一段代码:
int main()
{
int(1)++; // 报错,表达式必须是能修改的左值
return 0;
}
我们都知道上面这段代码会报错,因为匿名对象int(1)
本质上是一种临时变量,而临时变量是具有常属性的,所以不能被修改,不能执行++
操作。
int
是内置类型,如果我们换成自定义类型呢?
class Solution
{
public:
Solution(int data = 0)
:_data(data)
{}
Solution operator++(int)
{
Solution temp(*this);
_data++;
return temp;
}
private:
int _data;
};
int main()
{
Solution& s1 = Solution(0); // 报错,权限提升
const Solution& s2 = Solution(0); // 不报错,权限平移
return 0;
}
可以发现,自定义类型的临时对象也是有常属性的,如果要取到临时对象的引用,必须使用const
,相当于给临时对象取一个名字,延长它的生命周期。目前为止,自定义类型的临时对象和内置类型临时对象属性完全相同。
2. C++对自定义类型临时变量的特殊处理:
class Solution
{
public:
Solution(int data = 0)
:_data(data)
{}
Solution operator++(int)
{
Solution temp(*this);
_data++;
return temp;
}
private:
int _data;
};
int main()
{
Solution(0)++; // 不报错,具有常属性的临时变量可以使用非const成员函数
return 0;
}
按理说,Solution(0)
是一个临时对象,是具有常属性的,但是它却可以调用非const
的成员函数,进而可以对这个临时对象内部的值进行修改,突破了常属性的限制。这里可以认为是C++对自定义类型做的一个特殊处理。