为什么const对象只能调用const成员函数,而不能调用非const成员函数?

我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?

 

1 class test{
2   int i;
3 public:
4   void print();
5   test(int i);
6 };

 

我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,实际的print函数应该是这样的void print(test * this);,这代表一个指向test对象的指针this被传入到了print函数中

假如现在我们用test类创建一个对象,

1 test obj1(12);
2 obj1.print();

第二句,obj1.print();其实相当于print(&obj1);,即把当前的对象obj1的指针传递到print()函数,这是没问题的

如果用test类创建一个const对象,然后去调用print()函数呢?这就会出现问题

const test obj2(122);
obj2.print();

这时obj2对象的指针就会传递给test *this 指针,而obj2的地址翻译成指针类型应该是这样的,const test* this,即这时会出现类型不匹配的错误,在visual studio 中会出现类似于下面的错误:

4

所以通过上面的说明,我们知道了为什么const 对象不能调用非const成员函数。

 

 

下面解释为什么const 对象可以调用const成员函数,

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成员函数。

 

有一个点要注意,在c++中其实是有最小权限原则的,

 

非const对象是可以调用const成员函数的!

 

最近添加了一条  蓝色字体 也是最初的常见的说法!!!

 

小结:

 

1) 类成员函数声明中的 const 后缀,表明其 this 指针指向 const 型类对象,因此该 const 类对象,可以调用常量成员函数 (const member function)

 

2) 一个成员函数,如果对数据成员只涉及读操作,而不进行修改操作,则尽可能声明为常量成员函数   (!!!) 其实有成员变量加上 mutable 修饰时就可以修改了

 

 

 

请谨记

 

1、const成员函数是class中比较特殊的函数。这种函数不能调用非const成员函数。

 

2、声明const的对象,只能调用const成员函数,而不能调用其他成员函数。

 

posted on   zhangkele  阅读(351)  评论(0编辑  收藏  举报

编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示