C++: C++函數聲明的時候后面加const
轉自:http://blog.csdn.net/zhangss415/article/details/7998123
非靜態成員函數后面加const(加到非成員函數或靜態成員后面會產生編譯錯誤),表示成員函數隱含傳入的this指針為const指針,決定了在該成員函數中,任意修改它所在的類的成員的操作都是不允許的(因為隱含了對this指針的const引用);唯一的例外是對于mutable修飾的成員。加了const的成員函數可以被非const對象和const對象調用,但不加const的成員函數只能被非const對象調用。例如:?
1 class A { 2 private: int m_a; 3 public: 4 A() : m_a(0) {} 5 int getA() const { 6 return m_a; //同return this->m_a;。7 } 8 int GetA() { 9 return m_a; 10 } 11 int setA(int a) const { 12 m_a = a; //這里產生編譯錯誤,如果把前面的成員定義int m_a;改為mutable int m_a;就可以編譯通過。 13 } 14 int SetA(int a) { 15 m_a = a; //同this->m_a = a; 16 } 17 }; 18 A a1; 19 const A a2; 20 int t; 21 t = a1.getA(); 22 t = a1.GetA(); 23 t = a2.getA(); 24 t = a2.GetA(); //a2是const對象,
調用非const成員函數產生編譯錯誤。 一般對于不需修改操作的成員函數盡量聲明為const成員函數,以防止產生const對象無法調用該成員函數的問題,同時保持邏輯的清晰。
?
補充:
c++ 在函數后加const的意義:我們定義的類的成員函數中,常常有一些成員函數不改變類的數據成員,也就是說,這些函數是"只讀"函數,而有一些函數要修改類數據成員的值。如果把不改變數據成員的函數都加上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的成員
請看這兩個函數
const int getValue();
int getValue2() const;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* ?* FunctionConst.h ?*/ #ifndef FUNCTIONCONST_H_ #define FUNCTIONCONST_H_ class?FunctionConst?{ public: ? ??int?value; ? ? FunctionConst(); ? ??virtual?~FunctionConst(); ? ??const?int?getValue(); ? ??int?getValue2()?const; }; #endif /* FUNCTIONCONST_H_ */ |
源文件中的實現
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /* ?* FunctionConst.cpp? ?*/ #include "FunctionConst.h" FunctionConst::FunctionConst():value(100)?{ ? ??// TODO Auto-generated constructor stub } FunctionConst::~FunctionConst()?{ ? ??// TODO Auto-generated destructor stub } const?int?FunctionConst::getValue(){ ? ??return?value;//返回值是 const, 使用指針時很有用. } int?FunctionConst::getValue2()?const{ ? ??//此函數不能修改class FunctionConst的成員函數 value ? ? value?=?15;//錯誤的, 因為函數后面加 const ? ??return?value; } ? |