我們定義的類的成員函數中,常常有一些成員函數不改變類的數據成員,也就是說,這些函數是"只讀"函數,而有一些函數要修改類數據成員的值。如果把不改變數據成員的函數都加上const關鍵字進行標識,顯然,可提高程序的可讀性。其實,它還能提高程序的可靠性,已定義成const的成員函數,一旦企圖修改數據成員的值,則編譯器按錯誤處理。 const成員函數和const對象 實際上,const成員函數還有另外一項作用,即常量對象相關。對於內置的數據類型,我們可以定義它們的常量,用戶自定義的類也一樣,可以定義它們的常量對象。
1、非靜態成員函數后面加const(加到非成員函數或靜態成員后面會產生編譯錯誤)
2、表示成員函數隱含傳入的this指針為const指針,決定了在該成員函數中, 任意修改它所在的類的成員的操作都是不允許的(因為隱含了對this指針的const引用);
3、唯一的例外是對於mutable修飾的成員。加了const的成員函數可以被非const對象和const對象調用,但不加const的成員函數只能被非const對象調用
char getData() const{
return this->letter;
}
c++ 函數前面和后面 使用const 的作用:
- 前面使用const 表示返回值為const
- 后面加 const表示函數不可以修改class的成員
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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 <iostream>
using namespace std;
class A{
private:
int m_a;//int前加mutable關鍵字修飾即可編譯通過
public:
A():m_a(0){}
int setA(int a) const
{
this->m_a = a;//error: l-value specifies const object
}
int setA(int a)
{
this->m_a = a;
}
};
int main()
{
A a1;
return 0;
}
編譯錯誤:error C2166: l-value specifies const object,左值為const,即const修飾后成員函數中的this指針為const,它所指向的成員變量不能被修改,將成員變量用mutable修飾后編譯通過。
3、const成員函數與const對象
const成員函數還有另外一項作用,即常量對象相關。對於內置的數據類型,我們可以定義它們的常量,對用戶自定義的類類型也是一樣,可以定義它們的常量對象。有如下規則:
①、const對象只能調用后const成員函數;
#include <iostream>
using namespace std;
class A{
private:
int m_a;
public:
A():m_a(0){}
int getA() const
{
return m_a;
}
int GetA() //非const成員函數,若在后面加上const修飾則編譯通過
{
return m_a;
}
int setA(int a)
{
this->m_a = a;
}
};
int main()
{
const A a2;//const對象
int t;
t = a2.getA();
t = a2.GetA();//error:const object call non-const member function,only non-const object can call
return 0;
}
錯誤為:error C2662: ‘GetA’ : cannot convert ‘this’ pointer from ‘const class A’ to 'class A &'
②、非const對象既可以調用const成員函數,又可以調用非const成員函數。
#include <iostream>
using namespace std;
class A{
private:
int m_a;
public:
A():m_a(0){}
int getA() const
{
return m_a;
}
int GetA()
{
return m_a;
}
int setA(int a)
{
this->m_a = a;
}
};
int main()
{
A a1;//非const對象
int t;
t = a1.getA();//調用const成員函數,正確
t = a1.GetA();//調用非const成員函數,正確
return 0;
}
————————————————
版權聲明:本文為CSDN博主「Gorgeous_mj」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Gorgeous_mj/article/details/90574796