c++
雖然採取了不少有效的措施(如設private保護)以增加資料的安全性,但是有些資料卻往往是共享的,人們可以在不同的場合通過不同的途徑訪問同乙個資料物件。有時在無意之中的誤操作會改變有關資料的狀況,而這是人們所不希望出現的。
既要使資料能在一定範圍內共享,又要保證它不被任意修改,這時可以使用const,即把有關的資料定義為常量。
常物件
在定義物件時指定物件為常物件。常物件必須要有初值,如:
time const t1(12,34,46); //t1
是常物件
這樣,在所有的場合中,物件t1中的所有成員的值都不能被修改。凡希望保證資料成員不被改變的物件,可以宣告為常物件。
定義常物件的一般形式為:
類名 const 物件名[(實參表列)];
也可以把const寫在最左面:
const
類名 物件名[(實參表列)];
二者等價。
如果乙個物件被宣告為常物件,則不能呼叫該物件的非const型的成員函式(除了由系統自動呼叫的隱式的建構函式和析構函式)。例如,對於例
9.7中已定義的time類,如果有
const time t1(10,15,36); //
定義常物件t1
t1.get_time( ); //
企圖呼叫常物件t1中的非const型成員函式,非法
這是為了防止這些函式會修改常物件中資料成員的值。
不能僅依靠程式設計者的細心來保證程式不出錯,編譯系統充分考慮到可能出現的情況,對不安全的因素予以攔截。
現在,編譯系統只檢查函式的宣告,只要發現呼叫了常物件的成員函式,而且該函式未被宣告為const,就報錯,提請程式設計者注意。
引用常物件中的資料成員很簡單,只需將該成員函式宣告為const即可。如:
void get_time( ) const ; //
將函式宣告為const
這表示get_time是乙個const型函式,即常成員函式。
常成員函式可以訪問常物件中的資料成員,但仍然不允許修改常物件中資料成員的值。
有時在程式設計時有要求,一定要修改常物件中的某個資料成員的值,ansi c++考慮到實際程式設計時的需要,對此作了特殊的處理,對該資料成員宣告為mutable,如:
mutable int count;
把count宣告為可變的資料成員,這樣就可以用宣告為const的成員函式來修改它的值。
常物件成員
可以將物件的成員宣告為const,包括常資料成員和常成員函式。 1)
常資料成員
其作用和用法與一般常變數相似,用關鍵字const來宣告常資料成員。常資料成員的值是不能改變的。
有一點要注意: 只能通過建構函式的引數初始化表對常資料成員進行初始化。
如在類體中定義了常資料成員hour:
const int hour; //
宣告hour為常資料成員
不能採用在建構函式中對常資料成員賦初值的方法,下面的做法是非法的:
time::time(int h)
// 非法
因為常資料成員是不能被賦值的。
在類外定義建構函式,應寫成以下形式:
time::time(int h):hour(h){} //
通過引數初始化表對常資料成員hour初始化
常物件的資料成員都是常資料成員,因此常物件的建構函式只能用引數初始化表對常資料成員進行初始化。
2) 常成員函式
前面已提到,一般的成員函式可以引用本類中的非const資料成員,也可以修改它們。如果將成員函式宣告為常成員函式,則只能引用本類中的資料成員,而不能修改它們,例如只用於輸出資料等。如
void get_time( ) const ; //
注意const的位置在函式名和括號之後
const
是函式型別的一部分,在宣告函式和定義函式時都要有const關鍵字,在呼叫時不必加const。常成員函式可以引用const資料成員,也可以引用非const的資料成員。const資料成員可以被const成員函式引用,也可以被非const的成員函式引用。具體情況可以用表9.1表示。
表 9.1
資料成員
非const成員函式
const
成員函式
非const的資料成員
可以引用,也可以改變值
可以引用,但不可以改變值
const
資料成員
可以引用,但不可以改變值
可以引用,但不可以改變值
const
物件的資料成員
不允許可以引用,但不可以改變值
那麼怎樣利用常成員函式呢? 1.
如果在乙個類中,有些資料成員的值允許改變,另一些資料成員的值不允許改變,則可以將一部分資料成員宣告為const,以保證其值不被改變,可以用非const的成員函式引用這些資料成員的值,並修改非const資料成員的值。
2.如果要求所有的資料成員的值都不允許改變,則可以將所有的資料成員宣告為const,或將物件宣告為const(常物件),然後用const成員函式引用資料成員,這樣起到「雙保險」的作用,切實保證
3.如果已定義了乙個常物件,只能呼叫其中的const成員函式,而不能呼叫非const成員函式(不論這些函式是否會修改物件中的資料)。這是為了保證資料的安全。如果需要訪問物件中的資料成員,可將常物件中所有成員函式都宣告為const成員函式,但應確保在函式中不修改物件中的資料成員。
不要誤認為常物件中的成員函式都是常成員函式。常物件只保證其資料成員是常資料成員,其值不被修改。如果在常物件中的成員函式未加const宣告,編譯系統把它作為非const成員函式處理。
還有一點要指出,常成員函式不能呼叫另乙個非const成員函式
C 之常物件,常物件成員
一.常物件 1.常物件定義 time const t1 1,2,3 或者const time t1 2.常物件不能呼叫該物件的非const型的成員函式 系統主動呼叫的構造析構函式除外 3.常成員函式的宣告方法,後面加個const即可 void get time const 4.常物件不能修改物件內的...
C 之常物件,常成員物件,常成員函式,常指標
一 常物件 time const t1 12,23,23 其中所有的值不能被修改。通過該物件只能呼叫它的常成員函式,而不能呼叫它的普通成員函式。以防普通成員函式會修改資料成員的值。但如果一定要修改常物件資料成員的值,可以將該資料成員宣告為mutable,如 mutable int count 把co...
C 中常物件 常成員函式 常成員變數
用const修飾的類物件叫做常物件,用const修飾的成員函式叫常成員函式,用const修飾的成員變數叫常成員變數,常物件 型如 const 類名 物件名 類名 const 物件名 說明 1.常物件內的成員變數值不可修改,所以一定要在定義物件時初始化。2.常物件只可以呼叫常成員函式,但是非常物件可以...