某類中可以這麼聲明定義兩個函數,可以重載(overload)
void pa(){ cout<<"a"<<endl; } void pa() const{ cout<<"b"<<endl; }
上面的寫法是正確的。
基於這個事實,我思考了一下它的機制。
試驗得出,
普通函數(不是類的成員函數),可以這樣來重載(overload):
void fun(const int &a) { cout<<a<<endl; } void fun(int &a) { cout<<a<<endl; }
第二個事實說明了:如果函數參數是【引用類型】,那麼【const】 和 【不加const】 可以重載。
普通函數(不是類的成員函數),也可以用指針這樣來重載(overload):
void test(const int* a){ cout<<*a<<endl; } void test(int* a){ cout<<*a<<endl; }
第三個事實說明了,指針也可以在前面加 const 和 不加const 來重載。
按照c++ primer裡面的說法,一個成員函數本身有一個隱式的參數: ClassName* const this//不要管這個const,跟本文主題無關.
但是還是先來解釋一下這個const,就是說,一個指針,本身不能再指向別人了,只能指向自己。
所以,你在類裡面不能更改this的值,
this = 0;//錯誤!
再來說這兩個類成員函數:
void pa(); void pa() const;
可以寫全,成為好理解的偽代碼,像這樣:
void pa(ClassName *const this); void pa(const ClassName *const this);
第一個好理解,上面已經說過了。
第二個就是,c++提供給使用者的一個特殊語法,就是說成員函數加const,這個const實際上就是加給了隱式參數this的前面。
好了,總結:
這就是為什麼成員函數可以通過加const修飾符來重載。