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

在c++中,咱们能够用const来定义一个const对象,const对象是不能够调用类中的非const成员函数,这是为何呢?下面是我总结的一些原理。c++

假设有一个类,名字为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函数中this

假如如今咱们用test类建立一个对象,spa

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 中会出现相似于下面的错误:code

4对象

因此经过上面的说明,咱们知道了为何const 对象不能调用非const成员函数。blog

 

 

下面解释为何const 对象能够调用const成员函数,io

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

相关文章
相关标签/搜索