1. 在C++中只有被声明为const的成员函数才能被一个const类对象调用。
如果要声明一个const类型的类成员函数,只需要在成员函数列表后加上关键字const, 例如:
class Screen {
public:
char get() const;
};
在类体之外定义const成员函数时,还必须加上const关键字,例如:
char Screen :: get() const {
return _screen[_cursor];
}
若将成员函数声明为const,则不允许通过其修改类的数据成员。
值得注意的是,如果类中存在指针类型的数据成员即便是const函数只能保证不修改该指针的值,并不能保证不修 改指针指向的对象。例如:
class Name {
public:
void setName(const string &s) const;
private:
char *m_sName;
};
void setName(const string &s) const {
m_sName = s.c_str();
for (int i = 0; i < s.size(); ++i)
m_sName[i] = s[i];
}
m_sName 不能通过setName()函数修改,但是 setName函数可以修改其所指向的字符。
2. const成员函数可以被对应的具有相同形参列表的非const成员函数重载,例如:
class Screen {
public:
char get(int x,int y);
char get(int x,int y) const;
};
在这种情况下,类对象的常量性决定调用哪一个函数:
- const成员函数可以访问非const对象的非const数据成员,const数据成员,也可以访问const对象内的所有数据成员;
- 非const成员函数只可以访问非const对象的任意的数据成员(不能访问const对象的任意数据成员);
(上述原因可详见C++Primer(5th)231页, 在默认情况下,this的类型是指向类类型非常量版本的常量指针,例如 Screen类中,this类型为 Screen *cosnt。当在成员函数的后面加上const关键字时,隐式的将this指针修改为 const Screen *const 即指向类类型常量版本的常量指针。根据初始化原则,我们不能将一个常量指针赋值给一个非常量指针) - 作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改, 应尽可能将该成员函数声明为const成员函数。