关于类的const成员的一些小细节要注意:
(1)下面这个错误的意思是我在我的非const成员中调用了const成员函数,这是会报错的!!!!
In file included from circularListWithHeader.cpp:1:0:
circularListWithHeader.h: In instantiation of ‘T& circularListWithHeader<T>::get(int) const [with T = int]’:
circularListWithHeader.cpp:10:1: required from here
circularListWithHeader.h:45:15: error: passing ‘const circularListWithHeader<int>’ as ‘this’ argument discards qualifiers [-fpermissive]
checkIndex(theIndex);
^
circularListWithHeader.h:120:27: note: in call to ‘void circularListWithHeader<T>::checkIndex(int) [with T = int]’
template<typename T> void circularListWithHeader<T>::checkIndex(int theIndex){
为什么会报错呢?
首先所有的非const成员函数中都有一个默认的形参为 class *const this(这样表示是错误的,这里只是想让大家更容易明白这个this参数)。this参数表示的是指向本对象的一个指针。然后它是一个const的,也就是说this的值是不能改变的,它指向的对象里边的内容是可以被改变的(这里简单点说就是,我的this指向的对象是不能改变的,也就是说this表示的只能是其对象本身;但是这个对象里边的内容是可以改变的,也就是它的成员是可以被改变的)
所以这个 class *const this就很好的表现了这一点。然后如果是常量对象,那么它传入的this就是const class * const this。所以这个时候,
我的常量对象只能去调用const成员函数。之所以是这样是因为 const class * const 对象只能被const class * const接受,是不可以被
class * const 对象接受的!!!
所以常量对象只能调用常量成员函数。
接下来分析下非常量成员函数与常量成员函数之间的调用关系:
因为在成员函数调用另一个成员函数的时候,this是隐式传递的。所以一个非常量成员函数(class *const this),调用常量成员函数的时候
传递this过程是:
class *const this 要变成 const class * const this了,这种改变是可以的。
所以非常量成员函数是可以调用常量成员函数的。
但是反过来,如果常量成员函数调用非常量成员函数,那么进行的this转换就是
const class * const this 转成 class * const this;这个转换就是错误的了
因为上面的转换是错误的,所以常量成员函数是不能调用非常量成员函数的。
小结下:
(1)常量类对象只能调用常量成员函数。非常量类对象既可以调用常量成员函数,也可以调用非常量成员函数
(2)在类内部,常量成员函数只能调用常量成员函数;非常量成员函数既可以调用常量成员函数也可以调用非常量成员函数。
关于类的常量成员函数和非常量成员函数之间的可调用关系
最新推荐文章于 2025-03-19 15:40:19 发布