const可以放在成員方法的三個地方,前、中、後。
首先考慮在中間:
1、const修飾形參,表示形參是否為const
2、如果const修飾引用(指標指向的物件),可以進行過載,如果不是修飾引用(指標指向的物件),不能進行過載。為什麼?
首先考慮引用,引用是一個物件的別名,在呼叫的時候,編譯器根據原物件的常量性,可以找到一個最匹配的方法。const修飾指標指向的物件,和引用是同樣的道理。如果const不是修飾引用或者指標指向的物件,就不能過載。因為,這種情況下,是整體拷貝,拷貝後的物件和原物件沒有了任何關係。指標本身的常量性,不能過載,也是同樣道理。
3、考慮下面的情況,有方法 void SetAge(int& a); void SetAge(const int& a);
int a;
const int ca;
p.SetAge(a); // 呼叫void SetAge(int& a);
p.SetAge(ca); // 呼叫void SetAge(const int& a);
因為編譯器,是最優匹配。
a、考慮,如果沒有non-const方法的宣告和實現,出現什麼問題?
沒有問題,因為編譯器,找不到最優匹配,就會看看有沒有可以湊合使用的。const方法還是可以用的,因為在傳遞物件的時候,可以縮小操作物件的權力,但是不能放大權力。
b、如果沒有const方法的宣告和實現,出現什麼問題?
編譯出錯,傳遞物件的時候,不能放大權力。也就是說,不能把const物件傳遞引用給non-const物件。
c、如果只是,去掉non-const方法的實現,出現什麼問題?
出現“無法解析的外部命令”,為什麼?編譯器編譯的時候,找到了最優匹配,但是在連線的時候,卻找不到實現,這個時候,是不會再重頭,去找湊合使用的方法。這也說明了,過載是編譯十多型。
const在後面
1、const在後面,表示常量成員方法,不修改物件的內容。
2、const是否在方法後面可以進行過載,為什麼?
在成員方法中,this指標是const指標,不能修改this的指向。為什麼不能修改呢?不是辦不到。而是因為,考慮下面的情況,我在物件p上呼叫方法,在方法內部修改了this指向,再去操作,這個時候是修改新指向的物件,而不是原來的物件p,這明顯與程式猿的期望不一致。
而const成員方法中,this指標是指向const物件的const指標。由於編譯器是最優匹配,在呼叫方法的時候,編譯器能夠根據方法擁有者的常量性,決定const成員方法或non-const成員方法哪個最匹配。
也就是說,能不能過載的關鍵是,站在編譯器的角度考慮,在呼叫方法的時候,能不能確定最優匹配。如果兩個是同樣程度的匹配,是不行的。
const在前面
1、const在前面,表示返回物件的常量性,這個是不能進行過載的。為啥?
因為有些時候呼叫方法,是不關心返回值的。兩個方法完全一樣,指向返回值不一樣,在呼叫的時候,沒有處理返回值,編譯器是沒有辦法知道你是呼叫那個方法。
2、考慮下面的需求,根據方法擁有者的常量性,過載兩個方法,一個返回const,一個返回non-const,怎麼辦?
上面講了,不能通過返回物件的常量性過載。那麼,我們可以在方法後面加上const。