一、先来提出问题
const对象可以调用非const成员函数吗?
非const对象可以调用const成员函数吗?
const成员函数内可以调用其它的非const成员函数吗?
非const成员函数内可以调用其他的const成员函数吗?
二、实践出真知
1、const对象可以调用const成员函数
2、const对象不能调用非const成员函数
3、非const对象可以调用const成员函数
4、非const对象可以调用非const成员函数
5、const成员函数不能调用非const成员函数
6、非const成员函数可以调用非const成员函数
我们知道c 在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,实际的print函数应该是这样的void print(test * this);,这代表一个指向test对象的指针this被传入到了print函数中
假如现在我们用test类创建一个对象,
代码语言:javascript复制1 test obj1(12);
2 obj1.print();
第二句,obj1.print();其实相当于print(&obj1);,即把当前的对象obj1的指针传递到print()函数,这是没问题的
如果用test类创建一个const对象,然后去调用print()函数呢?这就会出现问题
代码语言:javascript复制const test obj2(122);
obj2.print();
这时obj2对象的指针就会传递给test *this 指针,而obj2的地址翻译成指针类型应该是这样的,const test* this,即这时会出现类型不匹配的错误,在visual studio 中会出现类似于下面的错误:
4
所以通过上面的说明,我们知道了为什么const 对象不能调用非const成员函数。
下面解释为什么const 对象可以调用const成员函数,
代码语言:javascript复制1 class test{
2 public:
3 void print()const;
4 };
前面我们把非const成员函数print(),翻译了一下,同样const成员函数也要翻译,void print()const; 可以翻译成 void print(const test* this);,那么常量对象的地址翻译是const test* this; 是和void print() const;中this指针的类型是一样的,所以常量对象可以调用const成员函数。
代码语言:javascript复制class UIRect:public RECT
{
public:
UIRect(LONG leftT = 0, LONG topT = 0, LONG rightT = 0, LONG bottomT = 0)
{
left = leftT;
top = topT;
right = rightT;
bottom = bottomT;
}
int GetWidth() const
{
return right - left;
}
int GetHeight() const
{
return bottom - top;
}
};
void DrawRect(const UIRect& rect)
{
rect.GetWidth();
}
/只有函数右边带了const,才能被const对象使用,
否则报编译错误,
error C2662: 'UIRect::GetWidth' :
cannot convert 'this' pointer from 'const UIRect' to 'UIRect &'