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