C 函式前後加const的區別

2021-09-23 17:04:27 字數 1805 閱讀 7606

1、函式前後const

函式前const:普通函式或成員函式(非靜態成員函式)前均可加const修飾,表示函式的返回值為const,不可修改。格式為:

const returntype functionname(param list)
函式後加const:只有類的非靜態成員函式後可以加const修飾,表示該類的this指標為const型別,不能改變類的成員變數的值,即成員變數為read only(例外情況見2),任何改變成員變數的行為均為非法。此型別的函式可稱為唯讀成員函式,格式為:

returntype functionname(param list) const
說明:類中const(函式後面加)與static不能同時修飾成員函式,原因有以下兩點①c++編譯器在實現const的成員函式時,為了確保該函式不能修改類的例項狀態,會在函式中新增乙個隱式的引數const this*。但當乙個成員為static的時候,該函式是沒有this指標的,也就是說此時const的用法和static是衝突的;

②兩者的語意是矛盾的。static的作用是表示該函式只作用在型別的靜態變數上,與類的例項沒有關係;而const的作用是確保函式不能修改類的例項的狀態,與型別的靜態變數沒有關係,因此不能同時用它們。

2、const與mutable的區別

從字面意思知道,mutalbe是「可變的,易變的」,跟constant(既c++中的const)是反義詞。在c++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數(成員變數)將永遠處於可變的狀態,即使在乙個const函式中。因此,後const成員函式中可以改變類的mutable型別的成員變數。

#include using namespace std;

class a

int seta(int a) const

int seta(int a) };

int main()

編譯錯誤:error c2166: l-value specifies const object,左值為const,即const修飾後成員函式中的this指標為const,它所指向的成員變數不能被修改,將成員變數用mutable修飾後編譯通過。

3、const成員函式與const物件

const成員函式還有另外一項作用,即常量物件相關。對於內建的資料型別,我們可以定義它們的常量,對使用者自定義的類型別也是一樣,可以定義它們的常量物件。有如下規則:

①、const物件只能呼叫後const成員函式;

#include using namespace std;

class a

int geta() const

int geta() //非const成員函式,若在後面加上const修飾則編譯通過

int seta(int a) };

int main()

錯誤為:error c2662: 『geta』 : cannot convert 『this』 pointer from 『const class a』 to 'class a &'

②、非const物件既可以呼叫const成員函式,又可以呼叫非const成員函式。

#include using namespace std;

class a

int geta() const

int geta()

int seta(int a) };

int main()

參考

c 在類函式前 後加const的意義

我們定義的類的成員函式中,常常有一些成員函式不改變類的資料成員,也就是說,這些函式是 唯讀 函式,而有一些函式要修改類資料成員的值。如果把不改變資料成員的函式都加上const關鍵字進行標識,顯然,可提高程式的可讀性。其實,它還能提高程式的可靠性,已定義成const的成員函式,一旦企圖修改資料成員的值...

const放在函式前後的區別

int b 500 1 const int a b 2 int const a b 3 int const a b 4 const int const a b 對於1和2 const 放在 左側,就是用來修飾指標所指向的變數,即指標指向的是常量。若a是倉庫管理員,b是倉庫。即倉庫中的貨物 a 不允許...

c 函式後加const

函式後加const的三種情況 1 非靜態成員函式後面加const 加到非成員函式或靜態成員後面會產生編譯錯誤 2 表示成員函式隱含傳入的this指標為const指標,決定了在該成員函式中,任意修改它所在的類的成員的操作都是不允許的 因為隱含了對this指標的const引用 唯一的例外是對於mutab...