關於類的const成員的一些小細節要注意:
(1)下面這個錯誤的意思是我在我的非const成員中調用了const成員函數,這是會報錯的!!!!
In file included from circularListWithHeader.cpp:1:0:
circularListWithHeader.h: In instantiation of ‘T& circularListWithHeader<T>::get(int) const [with T = int]’:
circularListWithHeader.cpp:10:1: required from here
circularListWithHeader.h:45:15: error: passing ‘const circularListWithHeader<int>’ as ‘this’ argument discards qualifiers [-fpermissive]
checkIndex(theIndex);
^
circularListWithHeader.h:120:27: note: in call to ‘void circularListWithHeader<T>::checkIndex(int) [with T = int]’
template<typename T> void circularListWithHeader<T>::checkIndex(int theIndex){
爲什麼會報錯呢?
首先所有的非const成員函數中都有一個默認的形參爲 class *const this(這樣表示是錯誤的,這裏只是想讓大家更容易明白這個this參數)。this參數表示的是指向本對象的一個指針。然後它是一個const的,也就是說this的值是不能改變的,它指向的對象裏邊的內容是可以被改變的(這裏簡單點說就是,我的this指向的對象是不能改變的,也就是說this表示的只能是其對象本身;但是這個對象裏邊的內容是可以改變的,也就是它的成員是可以被改變的)
所以這個 class *const this就很好的表現了這一點。然後如果是常量對象,那麼它傳入的this就是const class * const this。所以這個時候,
我的常量對象只能去調用const成員函數。之所以是這樣是因爲 const class * const 對象只能被const class * const接受,是不可以被
class * const 對象接受的!!!
所以常量對象只能調用常量成員函數。
接下來分析下非常量成員函數與常量成員函數之間的調用關係:
因爲在成員函數調用另一個成員函數的時候,this是隱式傳遞的。所以一個非常量成員函數(class *const this),調用常量成員函數的時候
傳遞this過程是:
class *const this 要變成 const class * const this了,這種改變是可以的。
所以非常量成員函數是可以調用常量成員函數的。
但是反過來,如果常量成員函數調用非常量成員函數,那麼進行的this轉換就是
const class * const this 轉成 class * const this;這個轉換就是錯誤的了
因爲上面的轉換是錯誤的,所以常量成員函數是不能調用非常量成員函數的。
小結下:
(1)常量類對象只能調用常量成員函數。非常量類對象既可以調用常量成員函數,也可以調用非常量成員函數
(2)在類內部,常量成員函數只能調用常量成員函數;非常量成員函數既可以調用常量成員函數也可以調用非常量成員函數。
關於類的常量成員函數和非常量成員函數之間的可調用關係
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.