C++的常量成员函数

在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》 第五版


你可能感兴趣的:(C++的常量成员函数)