常數物件和常數成員函式:一個類別可以定義許多成員函式,但並不是每一個成員函式都對物件成員進行「存」的動作而更改物件成員的值。如果一個成員函式沒有更改物件成員的值,則可以被設為常數成員函式。
將函式設計為常數成員函式後,才可以被常數物件使用。如此一來,方能確保常數物件的物件成員值不會受到任何改變。
範例如:
class classA
{
public:
int a;
int b;
int get_a() const {return a;} //此一函式不會更改物件成員的值,可以將之設定為常數成員函式。
int get_b(){return b;}
void set_a(int a_) const {a=a_;} //這一行是錯誤示範,此一函式有能力更改物件成員的值,不能設為常數成員函式。
void set_b(int b_) {b=b_;}
classA(int a_=5,int b_=10){a=a_;b=b_;}
};
const classA A1; // 定義常數物件。註:定義常數物件時,一定要將物件成員的值都進行初始化。
cout<<A1.get_a()<<endl; //使用常數物件的常數成員函式
cout<<A1.get_b()<<endl; //這一行是錯誤示範。雖然此函式不會更改物件成員的值,但因為沒有被設為常數成員函式,所以不能被常數物件拿來使用。
A1.a=9; //這一行是錯誤示範。常數物件成員無法直接被類別外程式碼所設定。(不過一般物件放在public區域的物件成員可以被類別外程式碼所設定)
cout<<A1.a<<endl; //常數物件放在public區域的物件成員可以直接被類別外程式碼所讀取,顯示5。
註一:若一常數成員函式要被類別中的其他成員函式所使用時,要確保這「其他成員函式」也是常數成員函式,以確保常數物件成員的值不會遭到函式更動。
註二:就算一個物件不是常數物件,他也可以使用常數成員函式。