本文**
const到底是不是乙個過載的參考物件,請看下面的例子
class a
; //函式1
void f(int i) const ;//函式2
};這個地方的過載是沒有問題的,說明const 修飾函式能夠區分過載
class b
;這次編譯器會報出 'b::f' : redefinition; 的錯誤,說明const作為修飾返回值不能夠區分過載
class c
;這個是錯誤的,編譯通不過。那麼是不是說明內部引數的const不予過載呢?
再看下面的例子:
class d
; //函式3;
void f(const int &i);//函式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 引數的方法
const 與函式的關係
我們知道,如果要定義乙個唯讀的變數,可以這樣做const int a 5 那麼a也就一直等於5 今天遇到const和函式之間的問題,不太熟悉,因此了解了一下 第一種情況 int a const int b,const int c 在這個函式裡面,傳入的兩個引用 或者說是指標 的值都不能夠改變,對於非...
const型變數與函式過載
c 中定義const型變數,可以用乙個非const型變數或者const變數初始化這個const變數,但是如果不用型別強制轉換則不可以用乙個const變數初始化乙個非const變數。另外,我的觀點是const只能修飾乙個變數。上面的最後一句話,你可能有非議,我可以說明。第一,乙個const不能修飾乙個...
const 和 非const函式過載
在下面的 中a1呼叫const版本,a2呼叫非const版本。const a a1 a a2 a1.x a2.x 後面加const表示在該函式中不能對類的資料成員進行改變,比如 class a 這可以 int x const 當然有特殊情況,就是用mutable關鍵字修飾過的成員變數可以在宣告為co...