const 在類成員函式中的使用說明
在類中宣告成員函式的時候, 當不允許成員函式修改到我們的物件的成員變數的時候, 常常會在函式的名的尾部加上const 關鍵字修飾。 這樣, 如果我們無意中在函式內部修改到了資料成員, 或者呼叫了其他的非const 函式的時候, 編譯器會報錯。例如:
#include <iostream> using namespace std; class temp { public: temp(int age); int getAge() const; void setNum(int num); private: int age; }; temp::temp(int age) { this->age = age; } int temp::getAge() const { age+=10; // #Error...error C2166: l-value specifies const object # return age; } int main() { temp a(22); cout << "age= " << a.getAge() << endl; return 0; }
一般情況下, 當成員函式的返回值數給類物件的時候, 一般將該函式的返回型別用const 修飾(const 在函式名字之前), 以表示返回值是一個const 的物件, 或者是某個物件的引用是const。多用於運算子的過載。通常,不建議用const修飾函式的返回值型別為某個物件或對某個物件引用的情況。 原因如下:
如果返回值是某個物件為const或某個物件的引用為const ,則返回值具有const屬性,則返回例項只能訪問類a中的公有(public)資料成員和const成員函式,並且不允許對其進行賦值操作,這在一般情況下很少用到。 例如, 有一個class A, 成員函式宣告為:const A& A::F(const &A ) const; 第一個const 修飾Reference &的返回值。 也就是說返回值為const referece的object。 這是為了避免出現f(a)=b;的情況, 比如:
A a, b;
下面是錯誤的:
a.F(a)=b;//F函式返回a的引用,那這個就等價於a=b;既然如此,那不如直接寫a=b;
由於引數的傳遞方式是pass by referecnce, 所以第二個const 是修飾引數的, 避免在函式內部修改了引數。
最後一個const 是修飾呼叫這個函式的object。 也就是說不允許object 呼叫這個函式修改自己的資料成員。 NOTE: 為啥要放在最後面呢? 原因是const已經吧前面兩個位置佔住了。由於 因為成員函式的引數表裡無法出現呼叫函式的對像本身,所以就只能加到函式後面了,用來修飾*this的,const物件也只能呼叫字尾是const的方法.。