首先先回憶一下常成員函式
宣告:《型別標誌符》函式名(參數列)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...