http://www.cnblogs.com/menggucaoyuan/archive/2011/06/17/2083255.html
C++中定義const型變量,,可以用一個(gè)非const型變量或者const變量初始化這個(gè)const變量,,但是如果不用類型強(qiáng)制轉(zhuǎn)換則不可以用一個(gè)const變量初始化一個(gè)非const變量,。另外,,我的觀點(diǎn)是const只能修飾一個(gè)變量,。上面的最后一句話,,你可能有非議,我可以說明,。第一,,一個(gè)const不能修飾一個(gè)全局函數(shù)。第二,,你可能舉例說明C++的類中const可以修飾一個(gè)函數(shù),,但是你還記得每個(gè)函數(shù)中都可以用一個(gè)默認(rèn)的this指針,?C++編譯的時(shí)候會(huì)在函數(shù)的參數(shù)列表中添加一個(gè)類的this指針(靜態(tài)函數(shù)除外),此時(shí)如果函數(shù)被const修飾,,則這個(gè)const實(shí)際上是修飾這個(gè)this的,,const修飾的函數(shù)不能改變成員屬性值,其原因也在此,。所以可以通過const修飾變量來實(shí)現(xiàn)函數(shù)重載,,即函數(shù)名稱、參數(shù)個(gè)數(shù),、參數(shù)類別都一樣,,唯一的區(qū)別在于變量是否為const修飾。可能上面的解釋太羅嗦了,,還是一句“源碼之前,,了無秘密”:class A{public: A() {} void func(int *a) //相當(dāng)于void func(int *a, A *this) { std::cout << "_func_int_ptr_" << std::endl; } void func(const int *a) //相當(dāng)于void func(const int *a, A *this) { std::cout << "_func_const_int_ptr_" << std::endl; } void func(int *a) const //相當(dāng)于void func(int *a, const A *this) { std::cout << "_const_func_int_ptr_" << std::endl; } void func(const int *a) const //相當(dāng)于void func(const int *a, const A *this) { std::cout << "_const_func_const_int_ptr_" << std::endl; }};
int main(int argc, char* argv[]){ A a; int nValue = 3; const int nValueCnst = 3; a.func(&nValue); a.func(&nValueCnst);
const A aa; aa.func(&nValue); aa.func(&nValueCnst); return 0;}其輸出為:_func_int_ptr__func_const_int_ptr__const_func_int_ptr__const_func_const_int_ptr_從這里可以看出,通過const修飾一個(gè)變量可以實(shí)現(xiàn)同名稱函數(shù)的重載,。另外,,一個(gè)類的非const對象可以調(diào)用其const函數(shù),如果詳細(xì)參考第一段的解釋以及const函數(shù)編譯過程,,你應(yīng)該能明白其中的緣由,。原因就是可以用非const型對象非const型的this指針進(jìn)行初始化時(shí)。一個(gè)簡單的代碼例子如下:class A{public: A() { } void func(int *a) const { std::cout << "_const_func_int_ptr_"; }};
int main(int argc, char* argv[]){ A a; int value = 3; a.func(&value); return 0;}?
|