const型變數與函式過載

2021-05-23 09:14:59 字數 1144 閱讀 4522

c++中定義const型變數,可以用乙個非const型變數或者const變數初始化這個const變數,但是如果不用型別強制轉換則不可以用乙個const變數初始化乙個非const變數。另外,我的觀點是const只能修飾乙個變數。

上面的最後一句話,你可能有非議,我可以說明。第一,乙個const不能修飾乙個全域性函式。第二,你可能舉例說明c++的類中const可以修飾乙個函式,但是你還記得每個函式中都可以用乙個預設的this指標?c++編譯的時候會在函式的引數列表中新增乙個類的this指標(靜態函式除外),此時如果函式被const修飾,則這個const實際上是修飾這個this的,const修飾的函式不能改變成員屬性值,其原因也在此。

所以可以通過const修飾變數來實現函式過載,即函式名稱、引數個數、引數類別都一樣,唯一的區別在於變數是否為const修飾。

可能上面的解釋太羅嗦了,還是一句「原始碼之前,了無秘密」:

class a

void func(int *a) //相當於void func(int *a, a *this)

void func(const int *a) //相當於void func(const int *a, a *this)

void func(int *a) const //相當於void func(int *a, const a *this)

void func(const int *a) const //相當於void func(const int *a, const a *this)

};int main(int argc, char* argv)

其輸出為:

_func_int_ptr_

_func_const_int_ptr_

_const_func_int_ptr_

_const_func_const_int_ptr_

從這裡可以看出,通過const修飾乙個變數可以實現同名稱函式的過載。另外,乙個類的非const物件可以呼叫其const函式,如果詳細參考第一段的解釋以及const函式編譯過程,你應該能明白其中的緣由。原因就是可以用非const型物件非const型的this指標進行初始化時。

乙個簡單的**例子如下:

class a

void func(int *a) const

};int main(int argc, char* argv)

const與函式過載的關係

本文 const到底是不是乙個過載的參考物件,請看下面的例子 class a 函式1 void f int i const 函式2 這個地方的過載是沒有問題的,說明const 修飾函式能夠區分過載 class b 這次編譯器會報出 b f redefinition 的錯誤,說明const作為修飾返回...

const 和 非const函式過載

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

函式過載之const

我們知道,如果函式名相同,在相同的作用域內,其引數型別 引數個數,引數順序不同等能構成函式過載。有趣的是如果同時在類中,對於函式名相同的const函式和非const函式能夠構成過載,同時它們被呼叫的時機為 如果定義的物件是常物件,則呼叫的是const成員函式,如果定義的物件是非常物件,則呼叫過載的非...