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