C++之善用const修饰成员函数

C++之善用const修饰成员函数

前言

​ 在C++编程中,使用const修饰成员函数是一种非常重要的技术手段,它能够提高代码的可维护性、可读性,并且有助于编译器进行更好的优化。下面将介绍一些在类中善用const修饰成员函数的案例,以及相应的代码示例。请尤其注意第二点和第三点在实际编程中的应用。


1. 约束函数对成员变量的修改

​ 通过在成员函数后面添加const关键字,我们可以约束该函数不能修改类的成员变量。这样一来,我们就能够清晰地表明哪些函数是用来修改对象状态的,哪些函数是用来访问对象状态的。

class A
{
public:
	A(int val = 10):m_val(val)
	{

	}

	// 成员函数修改了成员变量,不能声明为const
	void setVal(int val)
	{
		m_val = val;
	}

	// 成员函数不修改成员变量,应该声明为const
	int getVal() const
	{
		return m_val;
	}
private:
	int m_val;
};
void test1()
{
	A a1;
	cout << a1.getVal() << endl;
}

运行结果:
在这里插入图片描述

2. 允许 const 对象调用

当一个对象被声明为const时,只能调用它的const成员函数。如果类中没有明确标记为const的成员函数,那么 const 对象 将无法调用任何成员函数,因为编译器无法保证这些函数不会修改对象的状态。const 对象调用非 const 成员函数,本质上属于一种权限的放大

class A
{
public:
	// ...
	int getVal()	// 注意这里没有const修饰成员函数
	{
		return m_val;
	}
private:
	int m_val;
};
void test1()
{
	A a1;
	cout << a1.getVal() << endl;

	const A a2;
	cout << a2.getVal() << endl;
}

编译报错:

在这里插入图片描述

在这里插入图片描述

同时我们不难发现,a1 对象(非const对象)可以调用const成员函数,因为这属于权限的缩小

3. 在重载函数中提供重载决策

如果一个成员函数被声明为const,那么它与同名但没有被声明为const的函数构成重载。这样一来,根据对象的 const 属性,可以决定调用哪个版本的函数,提供更好的灵活性。

class B
{
public:
	B(int val = 10) :m_val(val)
	{

	}

	// getVal 函数的两个重载版本
	int getVal() const
	{
		cout << "Const function!" << endl;
		return m_val;
	}
	int getVal()
	{
		cout << "Non-const function!" << endl;
		return m_val;
	}
private:
	int m_val;
};
void test2()
{
	B b1;
	const B b2;

	b1.getVal();
	b2.getVal();
}

运行结果:

在这里插入图片描述


总结

​ 通过善用const修饰成员函数,我们能够在C++代码中提高代码的可维护性、可读性,并且更好地支持类的设计和重载。

在这里插入图片描述

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

螺蛳粉只吃炸蛋的走风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值