爲何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成員函數的

相關文章
相關標籤/搜索