1. 程式人生 > >const 在類成員函式中的使用說明

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的方法.。