文章目录
- 一、基本概念
- 二、经典问题
- 三、使用建议
一、基本概念
const 修饰的成员函数就称作 const 成员函数。
例子:
class Date
{
public:
void Display() const
{
...
}
private:
int _year;
int _month;
int _day;
};
事实上,const 成员函数的这个 const 修饰的是 *this
,也就是调用该成员函数的对象,因此在 const 成员函数内不能修改类的成员。
二、经典问题
来看下面几个问题:
const 对象可以调用非 const 成员函数吗?
不行,const 对象调用成员函数,传给 this 形参的是 const 对象的地址,而非 const 成员函数的 this 形参是普通对象的地址,这属于权限放大,是不合法的。
非 const 对象可以调用 const 成员函数吗?
可以,非 const 对象调用成员函数,传给 this 形参的是普通对象的地址,而 const 成员函数的 this 形参是 const 对象的地址,这属于权限缩小,是合法的。
const 成员函数内可以调用其它的非 const 成员函数吗?
不行,权限放大。
非 const 成员函数内可以调用其它的 const 成员函数吗?
可以,权限缩小。
注意,权限可以平移、可以缩小,但是不能放大。
三、使用建议
但凡函数体内不修改成员的成员函数,都用 const 修饰。
因为 const 对象可以调用 const 成员函数(权限平移),普通对象也可以调用 const 成员函数(权限缩小);而 const 对象不能调用非 const 成员函数(权限放大)。