深入理解C 函式過載const

2021-08-07 02:08:23 字數 2057 閱讀 9633

書上和網上在很多地方都對const 的過載做了一些解釋,但感覺都不是很詳細。還有很多同學在不同的地方發問關於const 過載的問題,這裡我又重新看了一下,做了乙個簡單的分析也可能有不對的地方,歡迎討論。

所謂過載,是指允許存在多個同名函式,而這些函式的參數列不同,即函式名相同但函式的簽名不同。過載並不是物件導向程式設計的特有屬性,這是因為過載是在編譯階段實現的,編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(這一點稍後有例子)。了

const 引數過載解析:

關於const 過載幾乎在所有c++的書中者提到過但大部分只是一句話,例如在《c++ primer》一書中這樣描述:「可基於函式的引用形參是指向 const 物件還是指向非 const 物件,實現函式過載。將引用形參定義為 const 來過載函式是合法的,因為編譯器可以根據實參是否為 const 確定呼叫哪乙個函式。」

但是這一段描述並沒有給出引用、指標和值傳遞前加const的實質區別是什麼。在用非const的指標,引用和值均可轉化為const的。這一點沒有太多可說明的東東。

對於函式值傳遞的情況,因為引數傳遞是通過複製實參建立乙個臨時變數傳遞進函式的,函式內只能改變臨時變數,但無法改變實參。則這個時候無論加不加const對實參不會產生任何影響。但是在引用或指標傳遞函式呼叫中,因為傳進去的是乙個引用或指標,這樣函式內部可以改變引用或指標所指向的變數,這時const 才是實實在在地保護了實參所指向的變數。因為在編譯階段編譯器對呼叫函式的選擇是根據實參進行的,所以,只有引用傳遞和指標傳遞可以用是否加const來過載。

下面給出乙個例子可能就更明白了:

輸出為:

通過檢視彙編可以知道:

int foo(int *test);和int foo(const int *test);分別被編譯器生成名為:_zn1a3fooepki和_zn1a3fooepi(這兩個名字會因為編譯器的不同而不同,名字只是乙個區分的符號而已不用深究,只用知道過載的函式經過編譯器的處理函式名字已經發生了變化。所以對於後面的彙編和鏈結工作就不存在過載的問題了。)這裡也同時說明對過載來說在編譯階段已經完成。

對於a.foo(&b);因為變數b有const修飾所以就呼叫了int foo(const int *test);對於a.foo(&c);呼叫int foo(int *test);因為這個是精確匹配的。但是如果沒有定義int foo(const int *test);則在**24行會出現編譯錯誤。反過來如果沒有定義函式:int foo(int *test);如下:

則輸出結果為:

原因c++ primer上講的很清楚:「we can use a non

const

object to initializer either a 

const

or non

const

reference. however, initializing a 

const

reference to a non

const

object requires a conversion, whereas initializing a non

const

parameter is an exact match.」

const 成員函式過載的解析:

const 成員函式過載的解析和const引數過載解析的原理可以說是一樣的。之所以這樣說是因為const成員函式的解析可被看做是對函式this引數用const來修飾的過程。例如下面**:

總結:1.const過載主要是通過能否對傳入的引數進行修改為判斷的。

2.const引數過載和const函式過載機制都是一樣的,因為對於const 函式過載可看做是對隱含的指標this的引數過載。

3.過載是在編譯階段已經完成,對於彙編和鏈結來說透明的。

深入理解C 過載函式

深入理解c 過載函式 1.定義 c 允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的個數 型別或者順序 必須不同,即函式的引數列表不同,也就是說用同乙個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。2.好處 函式過載...

深入理解函式

第五章 深入理解函式 1.return語句 有返回值的函式中,return語句的作用式提供整個函式的返回值,並結束當前函式返回到呼叫它的地方。在沒有返回值的函式中也可以使用return語句,例如當前檢查到乙個錯誤時提前結束當前函式的執行並返回 這個函式首先檢查引數x是否大於0,如果x不大於0就列印錯...

C 類函式深入理解

先看一段 class a void print const int main int argc,const char argv 執行結果 a print 0x100000eb0 print enter.this 0x0 a v 1 空指標 那麼問題來了。一般情況下,a null,為空指標,訪問a都是...