前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++中const和非const对象分别调用const和非const成员函数

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

作者头像
程序员小王
发布2023-03-21 14:57:18
1.1K0
发布2023-03-21 14:57:18
举报
文章被收录于专栏:架构说架构说

一、先来提出问题

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 &'
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档