成員方法與const之間的關係

Andy Niu發表於2013-12-07

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。

相關文章