函式過載之const

2021-06-26 07:37:21 字數 3225 閱讀 4054

我們知道,如果函式名相同,在相同的作用域內,其引數型別、引數個數,引數順序不同等能構成函式過載。有趣的是如果同時在類中,對於函式名相同的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 形參的型別和個數都不同 總之,普通函式過載取決於形參的個數和型別,與函式的返回值型別無關。但是,在類中,函式將區分常量函式和非常量函式的特徵標。也就是說,常量函式和非常量函式如果形參一樣,函式名一樣也是可以實現函...