C++ 方法后的const及引用限定符作用

本文详细解析了C++中const限定符在成员方法后的含义,它如何限制方法内对成员变量的修改,以及引用限定符在方法调用中的作用,包括左值、右值和const引用的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ 方法后的const及引用限定符作用

const 限定符

我们最早学习const应该是在字符串函数中使用的const char* szSource,
此时我们虽然可以通过szSource++,一个字符一个字符读取,但是无法修改字符内容,比如*szSource='a'

const跟在成员方法后

class Foo
{
public:
	Foo()
	{
		data = 10;
	}

	void show() const
	{
		//data = 11; //无法修改
		std::cout << data << std::endl;
	}
	
private:
	int data = 0;
};

可以看见成员方法后面跟着const,限定了在方法内无法修改类中成员的值,这是为什么,这里的const表示,在方法内隐式的this指针是个const类型,实际上就是const Foo* this。所以我们无法在show方法内直接修改data的值,除非将int data = 0;这里的定义加一个关键字mutable

为了再讲明白些,我加了3个方法,看方法内注释

class Foo
{
public:
	Foo()
	{
		data = 10;
	}

	void show() const
	{
		//data = 11; //无法修改
		std::cout << data << std::endl;
	}
	
	int& get()
	{
		return data;
	}

	//无法编译,因为const表示this指针为const,也就是无法修改成员
	//因此你返回的引用也必须是const
	//否则你返回成员引用,类外不就变成了可变吗。
	/*int& get1() const
	{
		return data;
	}*/


	//const int& 是一个通用引用类型
	//即可表示不可修改左值也可以表示右值
	const int& get2() const
	{
		//return 11; //所以返回左值右值都可以
		return data;
	}
private:
	int data = 0;
};

总结:const限定符在成员方法后,是为了限制这个方法不能修改成员,并且在这个方法内this指针是一个const类型。为了不影响这个语义,返回的成员引用也必须加上const

引用限定符

左值右值那篇文章我们知道了引用的作用,但是如果引用加在成员方法后呢?

引用限定符加在成员方法之后,是确保这个方法可以被什么类型的对象调用
举个栗子:

class Foo
{
public:
	Foo()
	{
		data = 10;
	}

	void show() & 
	{
		std::cout << data << std::endl;
	}

	void show2() const &
	{
		std::cout << data << std::endl;
	}

	void show3() &&
	{
		std::cout << data << std::endl;
	}
	
	
private:
	int data = 0;
};


int main(int argc, char* argv[])
{
	
	Foo f;
	f.show(); //show方法可以被左值对象调用,没问题
	f.show2(); //show2方法可以被const左值对象调用,虽然我们不是const,但是同样没问题
	f.show3(); //报错 show3方法只允许右值对象调用

	const Foo f2;
	f2.show(); //报错 show方法只允许左值对象调用,但是我们现在是个const左值
	f2.show2(); //show2方法可以被const左值对象调用,没问题
	f2.show3(); //报错 show3方法只允许右值对象调用

	//那么show3方法如何调用呢?还记得std::move()吗,他其实只是转义为右值,并没有真的去move什么东西。我们转为右值后调用试试
	std::move(f).show3(); //没问题
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没事干写博客玩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值