C++ 學習之函數重載、基於const的重載

函數重載

函數重載的定義是:在相同的作用域中,如果函數具有相同名字而僅僅是形參表不同,此時成爲函數重載。注意函數重載不能基於不同的返回值類型進行重載。

注意函數重載中的“形參表”不同,是指本質不同,不要被一些表象迷惑。main函數不能被重載。

下面三組定義本質是相同的,不是重載:

1)int sum (int &a); 和 int sum (int &);

2)  int sum (int a) 和 int sum (const int a);

3)typedef int DD;

     int sum(int a); 和 int sum (DD a);

其中第二個例子對於非引用傳參,形參是否const是等價的。但是當使用引用傳參時,有無const是不同的。使用指針傳參時,指向const對象的指針和指向非const對象的指針做形參的函數是不同的。

*下面談論一個比較噁心的問題,基於const的重載。

在類中會有這樣一種重載,它是合法的。

Class A {

int function ();

int function () const;

};

可以看到在A類中,function函數是發生重載了,而且是合法的。而且在調用時,只用A類的const對象才能調用const版本的function函數,而非const對象可以調用任意一種,通常非const對象調用不是const版本的function函數。

原因是:按照函數重載的定義,函數名相同而形參表有本質不同的函數稱爲重載。在類中,由於隱含的this形參的存在,const版本的function函數使得作爲形參的this指針的類型變爲指向const對象的指針,而非const版本的使得作爲形參的this指針就是正常版本的指針。此處是發生重載的本質。重載函數在最佳匹配過程中,對於const對象調用的就選取const版本的成員函數,而普通的對象調用就選取非const版本的成員函數。

(注:this指針是一個const指針,地址不能改,但能改變其指向的對象或者變量)

發佈了27 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章