const的重載講解

const到底是不是一個重載的參考對象,請看下面的例子

class A
{
public:
    void f(int i){ std::cout<<"1";}; //函數1
    void f(int i) const { std::cout<<"2" ;};//函數2

};

這個地方的重載是沒有問題的,說明const 修飾函數能夠區分重載

 

class B
{
    void f(int i);
    const void f(int i);

};

這次編譯器會報出 'B::f' : redefinition; 的錯誤,說明const作爲修飾返回值不能夠區分重載

class C
{
    void f(int i);
    void f(const  int i);
};

這個是錯誤的,編譯通不過。那麼是不是說明內部參數的const不予重載呢?
再看下面的例子:

class D
{
public:
    void f(int &i) { std::cout<<"3";}; //函數3;
    void f(const  int &i){ std::cout<<"4" ;};//函數4
};

 這個程序是正確的,看來上面的結論是錯誤的。爲什麼會這樣呢?這要涉及到
接口的透明度問題。按值傳遞時,對用戶而言,這是透明的,用戶不知道函數對形參
做了什麼手腳,在這種情況下進行重載是沒有意義的,所以規定不能重載!當指針或
引用被引入時,用戶就會對函數的操作有了一定的瞭解,不再是透明的了,這時重載
是有意義的,所以規定可以重載。

返回值不能作爲區分重載的條件。


現在來看一下成員 函數調用的情況:

A a;
a.f(1);

對於以上調用,如果函數1不存在就會調用函數2,如果函數1和函數2都存在,優先調用函數1.

const A a;
a.f(1);

卻只能調用函數2,如果函數2不存在,將會報錯。

int i = 0;
D d;
d.f(i);

以上調用既可以調用函數3也可以調用函數4,優先調用函數3.

const int i = 0;
D d;
d.f(i);

只能調用函數4,函數3存在函數4不存在,也不能調用函數3,直接報錯

總結: const 對象只能調用const 方法,非const 對象既能調用const 方法也能調用非const方法,優先調用非const方法。

如果重載的函數都是引用或指針,const 變量 只能調用帶有const 參數的方法,非const 變量既能調用帶const 參數的方法,也能調用不帶cosnt 參數的方法,優先調用不帶const 參數的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章