C++之常物件、常成員變數與常成員函式詳解
一、常物件說明:常物件是指物件的資料成員的值在物件被呼叫時不能被改變。常物件必須進行初始化,且能被更新。不能通過常物件呼叫普通成員函式,但是可以通過普通物件呼叫常成員函式。常物件只能呼叫常成員函式。常物件的宣告如下:
const <類名> <物件名> <類名> const <物件名> 兩種宣告完全一樣沒有任何區別。 1、通過下面例子來理解常物件: A、請指出下面程式的錯誤 複製程式碼程式碼如下:class A{
private:
int w,h;
public:
int getArea() const
{
return w*h;
}
int getW(){ return w;}
void setWH(int x,int y) {w=x,h=y;}
A(int x,int y){w=x,h=y;}
A(){;}//本例中不能省略
};
void main()
{
A a;//非常物件可以不初始化
a.setWH(3,9);
A const b; //常物件必須宣告的同時初始化,正確的是 A const b(3,6)。
b.setWH(3,7); // 假如上面改正後用這一句,還是錯誤應為b是常物件不能呼叫非常成員函式,切其值呼叫時不能改變,setWH()
cout<< a.getArea()<<endl<< b.getArea()<<c.getArea();
system("pause");
二、常成員變數
C++中使用const關鍵字修飾的成員變數就是常成員變數,有兩種定義方式:
const int c;
int const c;
需要注意的是:
1)任何函式都不可以對其值進行賦值和修改;
2)必須而且只能在建構函式的成員初始化列表中對其進行初始化;
3)假如類有多個建構函式,必須在所有的建構函式中都對其進行初始化。
三、常成員函式
前面已提到,一般的成員函式可以引用本類中的非const資料成員,也可以修改它們。如果將成員函式宣告為常成員函式,則只能引用本類中的
資料成員,而不能修改它們,例如只用於輸出資料等。如
void get_time( ) const ; //注意const的位置在函式名和括號之後
const是函式型別的一部分,在宣告函式和定義函式時都要有const關鍵字,在呼叫時不必加const。常成員函式可以引用const資料成員,也可以
引用非const的資料成員。const資料成員可以被const成員函式引用,也可以被非const的成員函式引用。具體情況可以用表9.1表示。
資料成員 |
非const成員函式 |
const成員函式 |
非const的資料成員 |
可以引用,也可以改變值 |
可以引用,但不可以改變值 |
const資料成員 |
可以引用,但不可以改變值 |
可以引用,但不可以改變值 |
const物件的資料成員 |
不允許 |
可以引用,但不可以改變值 |
那麼怎樣利用常成員函式呢?
1.如果在一個類中,有些資料成員的值允許改變,另一些資料成員的值不允許改變,則可以將一部分資料成員宣告為const,以保證其值不被改
變,可以用非const的成員函式引用這些資料成員的值,並修改非const資料成員的值。
2.如果要求所有的資料成員的值都不允許改變,則可以將所有的資料成員宣告為const,或將物件宣告為const(常物件),然後用const成員函式
引用資料成員,這樣起到“雙保險”的作用,切實保證
3.如果已定義了一個常物件,只能呼叫其中的const成員函式,而不能呼叫非const成員函式(不論這些函式是否會修改物件中的資料)。這是為了
保證資料的安全。如果需要訪問物件中的資料成員,可將常物件中所有成員函式都宣告為const成員函式,但應確保在函式中不修改物件中的數
據成員。
不要誤認為常物件中的成員函式都是常成員函式。常物件只保證其資料成員是常資料成員,其值不被修改。如果在常物件中的成員函式未加
const宣告,編譯系統把它作為非const成員函式處理。還有一點要指出,常成員函式不能呼叫另一個非const成員函式。