C++中const和非const对象分别调用const和非const成员函数

2023-03-21 14:57:18 浏览数 (1)

一、先来提出问题

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 &'

0 人点赞