const與函式過載的關係

2021-08-20 19:54:59 字數 1135 閱讀 7185

本文**

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...