C++之善用const修饰成员函数
文章目录
- C++之善用const修饰成员函数
- 前言
- 1. 约束函数对成员变量的修改
- 2. 允许 const 对象调用
- 3. 在重载函数中提供重载决策
- 总结
前言
在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++代码中提高代码的可维护性、可读性,并且更好地支持类的设计和重载。