C 中const用於函式過載

2021-09-10 23:52:23 字數 2271 閱讀 3619

首先先回憶一下常成員函式

宣告:《型別標誌符》函式名(參數列)const;

說明:(1)const是函式型別的一部分,在實現部分也要帶該關鍵字。

(2)const關鍵字可以用於對過載函式的區分。

(3)常成員函式不能更新類的成員變數,也不能呼叫該類中沒有用const修飾的成員函式,只能呼叫常成員函式。

(4)非常量物件也可以呼叫常成員函式,但是如果有過載的非常成員函式則會呼叫非常成員函式。

過載看例子:

#includeusing namespace std;  

class test

void fun() const

void fun()

};

int main()

結果為:

分兩種情況,一種情況下不允許過載,另一種允許。還是直接看例子吧:

#includeusing namespace std;  

void fun(const int i)

void fun(int i)

int main()

結果:編譯錯誤,提示重定義:

其實很好理解

void fun(int a)和

void fun(const int a);

實際上沒有區別,因為函式呼叫的時候,存在形實結合的過程,所以不管有沒有const都不會改變實參的值。

但是看下面的情況:

#includeusing namespace std;  

void fun(char *a)

void fun(const char *a)

int main()

結果:通過編譯,且輸出結果為:

很奇怪是嗎,這種情況和上面的情況難道不一樣嗎?

先別急,再來看乙個例子。然後再解釋。

#includeusing namespace std;  

void fun(char *a)

void fun(char * const a)

int main()

結果:編譯不通過,提示重定義:

好了,現在解釋原因。

第乙個例子中,我們說,fun(int i)和fun(const int i)是一樣的,是因為函式呼叫中存在實參和形參的結合。加入我們用的實參是int a,那麼這兩個函式都不會改變a的值,這兩個函式對於a來說是沒有任何區別的,所以不能通過編譯,提示重定義。

好了,那 fun(char *a)和fun(const char *a)是一樣的嗎?答案是:不一樣。因為char *a 中a指向的是乙個字串變數,而const char *a指向的是乙個字串常量,所以當引數為字串常量時,呼叫第二個函式,而當函式是字串變數時,呼叫第乙個函式。

但是char *a和char * const a,這兩個都是指向字串變數,不同的是char *a是指標變數 而char *const a是指標常量,這就和int i和const int i的關係一樣了,所以也會提示重定義。

最後說一下,對於引用,比如int &i 和const int & i 也是可以過載的,原因是第乙個i引用的是乙個變數,而第二個i引用的是乙個常量,兩者是不一樣的,類似於上面的指向變數的指標的指向常量的指標。

下面是例子:

#includeusing namespace std;  

void fun(const int &i)

{ cout << "fun(const int &) called "結果為:

最後謝謝,水草的專欄

C 中const用於函式過載的用法

常成員函式和非常成員函式之間的過載 首先先回憶一下常成員函式 宣告 型別標誌符 函式名 參數列 const 說明 1 const是函式型別的一部分,在實現部分也要帶該關鍵字。2 const關鍵字可以用於對過載函式的區分。3 常成員函式不能更新類的成員變數,也不能呼叫該類中沒有用const修飾的成員函...

在c 中用const函式過載

今天寫作業是遇到需要呼叫const物件中的函式,因為是const,所以成員函式無法訪問,需要進行過載 nodeiteratorbegin 如上所示的函式,我需要在const情況下呼叫,正確的寫法 nodeiteratorbegin const之前網上查到的規則是 c 函式過載 1 函式名稱必須相同。...

const 和 非const函式過載

在下面的 中a1呼叫const版本,a2呼叫非const版本。const a a1 a a2 a1.x a2.x 後面加const表示在該函式中不能對類的資料成員進行改變,比如 class a 這可以 int x const 當然有特殊情況,就是用mutable關鍵字修飾過的成員變數可以在宣告為co...