C++中关于自定义类型的一个特例:具有常属性的临时变量可以使用非const成员函数

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++对自定义类型做的一个特殊处理。


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-指短琴长-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值