在C++中,若类的成员函数的形参列表之后紧跟着const关键字,则该成员函数为常量成员函数。如下:
struct Sales_data
{
//数据成员
std::string bookNo;
unsigned uints_sold = 0;
double revenue = 0.0;
//成员函数
std::string isbn() const { return bookNo; } //常量成员函数
Sales_data& combin(const Sales_data&);
};
当我们调用类的成员函数时,实际上是调用具体的某个对象的成员函数。成员函数是通过一个名为this的额外的隐式形参来调用它的那个对象。即当我们调用某个对象的成员函数时,会将this指针和该对象进行绑定。
在成员函数内部,我们可以直接使用,并且能够正确的使用调用该函数的对象的成员,而不用通过成员运算符来具体指定某个对象,就是因为this所指的正是这个对象。因为this的目的总是指向“这个”对象,故this是一个常量指针,不允许改变this保存的地址(它保存的地址正是“这个”对象的地址)。
成员函数中,形参列表后面的const关键字,作用是修改隐式this指针的类型。前面说this指针是常量指针,其保存的地址不能改变,即只能指向“这个”对象。但是如果该对象被声明为常量对象,此时虽然this指针始终指向该常量对象,但是this却并不是一个指向常量的指针,它只是一个常量指针。换句话说,允许通过this指针来改变这个常量对象,岂不是有问题了?
这就意味着,我们不能调用一个常量对象的普通函数。因为这意味着将普通函数的隐式this常量指针,跟一个常量对象进行绑定。关键字const的作用就是将this指针由常量指针改为指向常量对象的常量指针。如此,可以被常量对象所调用。
由上面分析可以知道:
(1)常量成员函数形参列表后的const关键字,意味着this指针指向常量。
(2)常量成员函数不会改变调用它的对象(因为this指针已经被改为指向常量的指针)
(3)非常量对象可以调用常量成员函数,常量对象只能调用常量成员函数不能调用普通成员函数(即使该普通成员函数不改变调用它的对象)。
参考:《C++ primer》 第五版