我們知道,如果函式名相同,在相同的作用域內,其引數型別、引數個數,引數順序不同等能構成函式過載。有趣的是如果同時在類中,對於函式名相同的const函式和非const函式能夠構成過載,同時它們被呼叫的時機為:如果定義的物件是常物件,則呼叫的是const成員函式,如果定義的物件是非常物件,則呼叫過載的非const成員函式。例如:
#include
usingnamespacestd;
classa
intfunc(void)
//函式體限制為const,
intfunc(void)const
private:
intm;
};intmain(void)
另外,應該把不修改相應實參的形參定義為const引用,否則將限制該函式的使用,下面**將產生編譯錯誤:
string::size_type find_char(string &s, char c)
int main()
錯誤的原因:雖然字串字面值傳遞給函式可以產生區域性物件,但是這裡形參被宣告為引用,必須引用乙個已存在的物件,所以上述**才會導致編譯錯誤。
僅當形參是引用或指標時,形參是否為const才有過載現象。
class account
; void lookup(account &)
void lookup(const account &)
void lookup3(account *)
void lookup3( account const*)
void lookup4(account *) //錯誤,不能過載
void lookup4( account *const)//錯誤,不能過載
const account a(0);
account b;
lookup(a); //call lookup(const account &)
lookup(b); //call lookup(account &)
注意:不能基於指標
本身是否為const來實現函式的過載。例如,
f(int *);
f(int *const);
以上兩個函式無法構成過載。
通常地,不同的過載函式不能具有相同數目的引數和引數型別。函式的返回值型別,雖然屬於成員函式的
signature
的組成部分,但僅僅返回值型別不同,是不能構成函式過載的,因為這會造成
redefinition
的錯誤。
但有乙個例外,就是使用
const
關鍵字進行函式過載,是成員函式成為
const
函式。見下面的**:
// overloading based on const
#include
#include
using
namespace std;
class
aclass
string greeting() // (1)
//const string greeting() // (2)//
//string greeting() const // (3)//
const string greeting() const
// (4)
private:
const string greetingwords; };
intmain(void)
說明: a.
(1)和
(4)中的
greeting
的引數數目和型別都是完全一致的
(兩個函式都沒有引數
),按照通常的說法,這會出現編譯錯誤,但事實上,上面的程式可以正常執行。因此,
(1)和
(4)中的兩個
greeting
函式,並無
redefinition
的問題,這是因為
(4)中的
greeting
函式名稱後有乙個
const
關鍵字的緣故; b.
同樣道理,如果將這個
(4)定義的
greeting
注釋掉,使用
(3)中的
greeting
函式的定義,結果也是正確的,因為
(3)中的
greeting
函式名稱後也有乙個
const
關鍵字; c.
(3)和
(4)不能同時出現,否則會出現
redefinition
的編譯錯誤。因為它們之間的不同僅是返回值型別不同,乙個是
string
,另乙個是
const string
,而僅僅是返回值型別的不同,編譯器是無法區分兩個過載函式的不同; d.
基於上面的道理,
(1)和
(2)也不能同時出現; e.
結論。如果兩個函式的引數數目和資料型別都是一樣的,只要將其中乙個改為
const
成員函式
(即,函式名稱和引數後又
const
關鍵字)
,則仍然可以構成有效的函式過載; f.
輸出。上面的**輸出:
hello, world! – from nonconst version.
hello, world! – from const – const version.
a_class
是乙個nonconst
物件,因此選擇了
(1)中的
greeting
定義;b_class
是乙個const
物件,因此選擇了
(4)中的
greeting
定義。
const 和 非const函式過載
在下面的 中a1呼叫const版本,a2呼叫非const版本。const a a1 a a2 a1.x a2.x 後面加const表示在該函式中不能對類的資料成員進行改變,比如 class a 這可以 int x const 當然有特殊情況,就是用mutable關鍵字修飾過的成員變數可以在宣告為co...
const 成員函式過載
先看一段引用 1 許多人漠視一件事實 兩個成員函式如果只是常量性 constess 不同,可以被過載 ok,下面為了解釋,定義一下下面這個類 class cstring const char operator size t i const 注意這個const 常量,屬於函式簽名,因此導致過載 然後有...
C 函式過載之const特徵標
c 中,普通函式過載需要滿足一定的條件,如 1 形參的個數不同 2 形參的型別不同 3 形參的型別和個數都不同 總之,普通函式過載取決於形參的個數和型別,與函式的返回值型別無關。但是,在類中,函式將區分常量函式和非常量函式的特徵標。也就是說,常量函式和非常量函式如果形參一樣,函式名一樣也是可以實現函...