为什么const对象只能调用const成员函数,而不能调用非const成员函数?
来源:互联网 发布:比价的那个软件是什么 编辑:程序博客网 时间:2024/05/23 15:33
转载自http://www.cnblogs.com/cplinux/articles/5553716.html
在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。
假设有一个类,名字为test代码如下:
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成员函数的
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
- const对象调用非const成员函数
- cons对象/指针/引用,不能调用非const成员函数
- 非const对象也可以调用const成员函数
- 非const对象也可以调用const成员函数
- C++的const类成员函数(解释为什么非const成员函数不能访问const对象的数据成员)
- 为什么const对象只能访问const成员函数
- 为什么const对象只能访问const成员函数
- C++之const对象只能调用const成员函数---补充(18)《More Effective C++》
- const 对象只能调用 const 函数
- const 对象只能调用const函数
- const成员函数和const对象的调用关系
- const对象const成员函数
- const成员函数和非const的成员函数之间的调用
- const成员函数如何调用non-const成员变量
- 为什么static 成员函数不能为const
- 为什么静态成员函数不能是const
- Http请求中Content-Type讲解以及在Spring MVC中的应用
- 解决ausu MT7630 linux(ubuntu)下 wifi无法使用
- KMP算法
- Android Studio 2.2
- 【php】关键函数备忘录
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
- 数据倾斜的两个解决方案
- Netty发送序列化对象
- lint_code 两数之和
- 2017.6.2:重复计数自动化测试
- spring boot一些容易混的知识点
- Android编译系统模块中的LOCAL_XXX变量
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—E
- 深度剖析hdfs原理