**
const修飾類的成員函式
const修飾變數一般有兩種方式:const t *a,或者 t const *a,這兩者都是一樣的,主要看const位於*的左邊還是右邊,這裡不再贅述,主要來看一下當const修飾類的成員函式時,成員函式有什麼特點。
類的成員函式後面加 const,表明這個函式不會對這個類物件的資料成員(準確地說是非靜態資料成員)作任何改變。
在設計類的時候,乙個原則就是對於不改變資料成員的成員函式都要在後面加 const,而對於改變資料成員的成員函式不能加 const。所以 const 關鍵字對成員函式的行為作了更加明確的限定:
(1)有 const 修飾的成員函式(指 const 放在函式引數表的後面,而不是在函式前面或者參數列內),只能讀取資料成員,不能改變資料成員;沒有 const 修飾的成員函式,對資料成員則是可讀可寫的。
(2)除此之外,在類的成員函式後面加 const 還有什麼好處呢?那就是常量(即 const)物件可以呼叫 const 成員函式,而不能呼叫非const修飾的函式。
#include
#include
#include
using
namespace
std;
class
a
void
f()
const
};
int
main(
int
argc,
char
**ar**)
注意:兩個成員函式如果只是常量性不同,是可以被過載的。看下面解釋的第二點:
在c++中,只有被宣告為const的成員函式才能被乙個const類物件呼叫。
如果要宣告乙個const型別的類成員函式,只需要在成員函式列表後加上關鍵字const, 例如:
class screen ;在類體之外定義const成員函式時,還必須加上const關鍵字,例如:
char screen :: get() const若將成員函式宣告為const,則不允許通過其修改類的資料成員。 值得注意的是,如果類中存在指標型別的資料成員即便是const函式只能保證不修改該指標的值,並不能保證不修改指標指向的物件。例如:
class name ;void setname(const string &s) const
class screen ;在這種情況下,類物件的常量性決定呼叫哪乙個函式:int main()
const成員函式的寫法有兩種
1、void fun(int a,int b) const{}
2、void const fun(int a,int b){}
這兩種寫法的本質是:void fun (const 類 *this, int a,int b);
const修飾的不是形參a和b;const修飾的是屬性this->a和this->b。與const所寫的位置無關。
為什麼?
因為c++對類的this指標做了隱藏,本質上,const指標修飾的是被隱藏的this指標所指向的記憶體空間,修飾的是this指標。
總結:
1)const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員;
2)非const成員函式可以訪問非const物件的非const資料成員、const資料成員,但不可以訪問const物件的任意資料成員;
3)作為一種良好的程式設計風格,在宣告乙個成員函式時,若該成員函式並不對資料成員進行修改操作,應盡可能將該成員函式宣告為const 成員函式。
4)如果只有const成員函式,非const物件是可以呼叫const成員函式的。當const版本和非const版本的成員函式同時出現時,非const物件呼叫非const成員函式。
補充:
> 類中的const成員變數都要放在初始化列表之中進行
> const資料成員
> 引用資料成員
> 物件資料成員(內建類)
const成員函式
> void print() const => const 類名 * const this
> 在其內部是不能修改資料成員
> 只能呼叫const成員函式,不能呼叫非const成員函式
>const物件只能呼叫const成員函式,必須要提供乙個const版本的成員函式
const成員函式和成員變數這一塊的邏輯容易混亂!
C 類的const型別成員變數
includeusing namespace std class myclass 只能在構造函式引數行中對const型別成員變數初始化 不能在建構函式中初始化const型別成員變數 myclass類的建構函式myclass 的輸入引數必須包含 要給const成員變數const varible初始化的...
C 之 const類成員函式
const修飾的變數稱為常變數,不可修改,而const修飾的類成員函式限制為不可修改類的成員,只能讀取。寫法是將const放在函式引數列表後面,而不是放在函式前面或者放入引數列表內 class test 在類體之外定義const函式也需要加const int test getnum const 1....
c 學習之const成員變數與成員函式
常型別是指用型別修飾符const說明的型別,常型別的變數或者物件的值是不能被更新的。因此,定義或說明常型別時必須初始化。如果在乙個類宣告常資料成員,那麼任何函式中都不能對該成員賦值。建構函式對該成員進行初始化,只能通過初始化列表來實現。include using namespace std clas...