C 類和物件之特殊資料成員初始化和特殊成員函式

2021-10-05 05:48:41 字數 4791 閱讀 7013

目錄:

特殊資料成員的初始化

常量資料成員

引用資料成員

類物件成員

靜態資料成員

特殊的成員函式

靜態成員函式

const 成員函式

在 c++ 的類中,有4種比較特殊的資料成員,他們分別是常量成員、引用成員、類物件成員靜態成員,他們的初始化與普通資料成員有所不同。

常量資料成員

當資料成員用 const 關鍵字進行修飾以後,就成為常量成員。一經初始化,該資料成員便具有「唯讀屬性」,在程式中無法對其值修改。事實上,在建構函式體內初始化 const 資料成員是非法的,它們只能在建構函式初始化列表中進行初始化。如:

class

point

//正確寫法

point

(int ix =0,

int iy =0)

:_ix

(ix)

,_iy

(iy)

,_iz

(_ix)

private

:const

int _ix;

const

int _iy;

int& _iz;

};

引用資料成員

和常量成員相同,引用成員也必須在建構函式初始化列表中進行初始化引用作為資料成員時候,占用乙個指標大小的空間

類物件成員

乙個自定義的型別建立的物件作為另外乙個自定義型別的資料成員(子物件)的時候,缺省會呼叫子物件的預設(無參)的建構函式,如果我們想初始化,必須要顯示呼叫子物件的相應構造。

即當資料成員本身也是自定義類型別物件時,比如乙個直線類 line 物件中包含兩個 point 類物件,對 point物件的建立就必須要放在 line 的建構函式的初始化列表中進行。如

class

line

void

printline()

private

: point _pt1;

//其他物件成員

point _pt2;

};

當 line 的建構函式沒有在其初始化列表中初始化物件 _pt1 和 _pt2 時,系統也會自動呼叫 point 類的 預設建構函式,此時就會與預期的構造不一致。因此需要顯式在 line 的建構函式初始化列表中初始化_pt1 和 _pt2 物件。

靜態資料成員

c++ 允許使用static (靜態儲存)修飾資料成員,這樣的成員在編譯時就被建立並初始化的(與之相比,物件是在執行時被建立的),且其實例只有乙個,被所有該類的物件共享,就像住在同一宿舍裡的同學共享乙個房間號一樣。

靜態資料成員和之前介紹的靜態變數一樣,當程式執行時,該成員已經存在,一直到程式結束,任何該類物件都可對其進行訪問,靜態資料成員儲存在全域性/靜態區,並不佔據物件的儲存空間

下面以 computer 為例,模擬購買電腦的過程,為了獲取總價,我們定義乙個靜態變數 _totalprice :

class

computer

void

print()

//...

private

:char

* _brand;

double _price;

static

double _totalprice;

//全域性靜態,標頭檔案中

};

因為靜態資料成員不屬於類的任何乙個物件,所以它們並不是在建立類物件時被定義的。這意味著它們不是由類的的建構函式初始化的,一般來說,我們不能在類的內部初始化靜態資料成員,必須在類的外部定義和初始化靜態資料成員,且不再包含 static 關鍵字,格式如下:

型別 類名::變數名 = 初始化表示式;

//普通變數

型別 類名::物件名(構造引數)

;//物件變數

computer 中的靜態變數 _totalprice 的初始化如下:

//靜態資料成員必須放到類外部進行初始化

double computer::_totalprice =0;

//定義檔案中

除了特殊的資料成員以外, c++ 類中還有兩種特殊的成員函式:靜態成員函式const 成員函式

先看靜態成員函式。

靜態成員函式

成員函式也可以定義成靜態的,靜態成員函式的特點:

靜態成員函式內部不能使用非靜態的成員變數和非靜態的成員函式靜態成員函式內部只能呼叫靜態資料成員和靜態的成員函式

如果非要靜態成員函式中訪問非靜態成員,可以傳參

原因在於靜態成員函式的引數列表中不含有隱含的 this 指標,如下:

class

computer

//...

void

printtotalprice()

//...

private

:char

* _brand;

double _price;

static

double _totalprice;

};

對於靜態成員函式,還可以直接通過類名進行呼叫,這也是最常用的方式:

int

main

(void

)

下面再來看乙個有意思的例子:

class

nullpointcall

;int nullpointcall::_static =0;

void nullpointcall::

test1()

void nullpointcall::

test2()

void nullpointcall::

test3

(int test)

void nullpointcall::

test4()

intmain

(void

)

執行結果

程式中直接通過類名進行呼叫 text4,在 text4 函式中呼叫了非靜態成員

const 成員函式

之前已經介紹了 const 在函式中的應用,實際上, const 在類成員函式中還有種特殊的用法,把 const 關鍵字放在函式的參數列和函式體之間(與之前介紹的 const 放在函式前修飾返回值不同), 稱為const 成員函式,其具有以下特點:

只能讀取類資料成員,而不能修改之

只能呼叫 const 成員函式,不能呼叫非 const 成員函式。const 成員函式與非const成員函式可以進行過載,且const成員函式不能修改資料成員

非const物件可以呼叫兩種,但是預設呼叫非const成員函式const物件只能呼叫const成員函式

其格式為:

型別 函式名(引數列表)

const

比如當給 computer 類新增乙個 const 的列印函式後,則其實現如下:

class

computer

//也可以是

//void print() const

////非 const

void

print2()

//...

};

有以下情況:

computer com1

("thinkpad"

,8000);

//預設情況下,非 const物件可以呼叫非 const版本的成員函式

com1.

print2()

;//非 const物件可以呼叫 const版本的成員函式

com1.

print()

;const computer com2

("mi"

,5000);

//const物件可以呼叫 const版本的成員函式

com2.

print()

;//const物件不可以呼叫非 const版本的成員函式

c 中成員物件初始化和類繼承初始化

對於繼承的物件,建構函式在成員初始化列表中使用類名來呼叫特定的基類建構函式。對於成員物件,建構函式則使用成員名。例如 ifndef h frabjous define h frabjous include class frabjous virtual void tell gloam gloam in...

初始化C 類成員

問題 我的問題是關於初始化c 類成員的。我見過許多這樣的 包括在你的欄目中也見到過 csomeclass csomeclass x 0 y 1 而在別的什麼地方則寫成下面的樣子 csomeclass csomeclass x 0 y 1 我的一些程式設計師朋友說第二種方法比較好,但他們都不知道為什麼...

C 類資料成員的初始化

c 為類中提供類成員的初始化列表 類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算 1.類裡面的任何成員變數在定義時是不能初始化的。2.一般的資料成員可以在建構函式中初始化。3.const資料成員必須在建構函式的初始化...