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成員函式,如果定義的物件是非常物件,則呼叫過載的非...