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 參數的方法