一、有兩種const函數:1、const T func();
表示返回的是const的類型,也即返回的值不能作為左值。
2、T func() const; 表示該成員函數不能修改其成員變數的值,即該函數不能改變任何該類的非靜態成員的值。
例:
class A{public: int get_a() const{return a;}private:int a;int b;}這裡只是擷取a而已,不想改變成員a的值,所以就可以定位為const函數。
註:const 對於類的封裝是很有好處的,要知道用const定義後,其值是不能隨便改變的,相當於一個常量。如果類中的成員能隨便改變其屬性,類就會很混亂,代碼的重複利用就很差,不利於編程。
二、常對象的就調用const函數,其他的調用非const函數
const函數是常成員函數,只能由常對象調用,是常對象唯一的對外介面
class B1
{
public:
virtual void func() const //與下面的同名函數不屬於重載,完全是沒有關係的兩個函數
{
cout << "Const\n";
}
virtual void func()
{
cout << "Non Const\n";
}
};
int main()
{
B1 b;
B1 const b1;
b.func(); //調用普通函數
b1.func(); //調用const函數,const成員函數成為“唯讀”函數所以只能調用const成員函數。
return 0;
}
三、其他說法
後面加const表示在該函數中不能對類的資料成員進行改變比如:class A{ private: int aa;public:
int x()//這可以,普通函數{ return aa++; } //這可以int x() const //const函數{return aa++;//這錯誤}};但mutable關鍵字修飾過的成員變數可以在聲明為const 函數中被改變。關於mutable:關鍵字mutable是C++中一個不常用的關鍵字,只能用於類的非靜態和非常量資料成員 一個對象的狀態由該對象的非待用資料成員決定,所以隨著資料成員的改變, 對像的狀態也會隨之發生變化! 如果一個類的成員函數被聲明為const類型,表示該函數不會改變對象的狀態,也就是該函數不會修改類的非待用資料成員.但是有些時候需要在該類函數中對類的資料成員 進行賦值.這個時候就需要用到mutable關鍵字了 例如: class Demo { public: Demo(){} ~Demo(){} public: bool getFlag() const { m_nAccess++; return m_bFlag; } private: int m_nAccess; bool m_bFlag; }; int main() { return 0; } 編譯上面的代碼會出現 error C2166: l-value specifies const object的錯誤 說明在const類型的函數中改變了類的非待用資料成員. 這個時候需要使用mutable來修飾一下要在const成員函數中改變的非待用資料成員 m_nAccess,代碼如下: class Demo { public: Demo(){} ~Demo(){} public: bool getFlag() const { m_nAccess++; return m_bFlag; } private: mutable int m_nAccess;//此時該變數則變為可 修改 bool m_bFlag; }; int main() { return 0; }