1. 程式人生 > >C++之常物件、常成員變數與常成員函式詳解

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成員函式。