c 類資料成員的定義 宣告

2021-09-06 11:13:41 字數 1730 閱讀 7521

c++為類中提供類成員的初始化列表

類物件的構造順序是這樣的:

1.分配記憶體,呼叫建構函式時,隱式/顯示的初始化各資料成員

2.進入建構函式後在建構函式中執行一般計算

1.類裡面的任何成員變數在定義時是不能初始化的。

2.一般的資料成員可以在建構函式中初始化。

3.const資料成員必須在建構函式的初始化列表中初始化。

4.static要在類的定義外面初始化。   

5.陣列成員是不能在初始化列表裡初始化的。

6.不能給陣列指定明顯的初始化。  

這6條一起,說明了乙個問題:c++裡面是不能定義常量陣列的!因為3和5的矛盾。這個事情似乎說不過去啊?沒有辦法,我只好轉而求助於靜態資料成員。

到此,我的問題解決。但是我還想趁機複習一下c++類的初始化:

1.初始化列表:csomeclass::csomeclass() : x(0), y(1){}

2.類外初始化:int csomeclass::myvar=3;

3.const常量定義必須初始化,c++類裡面使用初始化列表;

4.c++類不能定義常量陣列。

關於const,複習一下常量指標:  

如果const位於星號的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量。

在c++類中,必須做如下事情:

1.必須對任何const或引用型別成員以及沒有預設建構函式的 類 型別 的任何成員 顯示地使用初始化列表進行初始化

2.類成員在定義時是不能被初始化的。

3.類的成員初始化順序與成員變數在建構函式中的位置選後順序無關,至於成員變數在類中定義的先後順序有關。

所以下面的例子是錯的:

1 class

x2 

12  } 

對與上面的code,因為i先被初始化(i相對於j先定義的)而在i初始化時,j並沒有被初始化,故執行出現問題了。

補充1:

類非靜態成員變數內部初始化是在建構函式中進行,而對於

類的靜態成員變數,由於其屬於類為所有類物件所共有,但不屬於任何乙個物件,所以不能在類的建構函式中初始化,因為類的建構函式是在定義類的物件時候呼叫的,而定義類的時候還沒有類物件呢,因此類的靜態成員變數不能在類內部初始化,只能在類外。

類靜態成員變數在類內需要宣告,還要在類外定義或初始化一次,這裡的定義可以不初始化,例如當該靜態成員為類自身型別(其實適用於任何型別)的時候,在類外可以只定義不初始化。若該靜態成員是const型別的,則可以在類的內部初始化(也即此時就不用在類外初始化了,大夥可以自己嘗試一下)

補充2:

類中的物件成員的定義和初始化:

1、物件成員初始化時,必須有相應的建構函式,且多個物件成員的構造次序不是按初始化成員列表的順序,而是按各類宣告的先後次序進行的

2、成員物件初始化可在類建構函式定義時進行

class

crect

private

: cpoint ptcenter;

csize size;

};

crect::crect(

int left, int top, int right, int bottom) :size(right-left, bottom-top), ptcenter((left+right)/2, (top+bottom)/2

)

類宣告和成員函式定義的分離

當乙個類被多個程式使用時,一般將 類的宣告 包含成員函式的宣告 放在指定的 標頭檔案中,使用者程式設計時,只需將這個標頭檔案包含進來,而不必在每個使用該類的程式中重複書寫其宣告。為了實現資訊隱蔽 即封裝後,使用者只能看到函式的宣告,知道如何去使用它,而不知道函式具體是如何實現的 對類的成員函式的定義...

c 類模板中靜態成員變數的宣告定義

我們知道,c 中,類的靜態成員是要在.cpp檔案中定義的,如果在.h中定義,會出現重複定義。但是在寫類模板時,一般所有的 都是放在.h檔案中的,如果要做分離是一件很麻煩的事。那如果出現了靜態成員怎麼辦?如 ca.h template class ca 對於這個m vec怎麼辦呢?難道要我們在每個使用...

類的靜態資料成員宣告 定義 初始化

在c 中,類的靜態成員 static member 必須在類內宣告,在類外初始化,像下面這樣。class a int a count 0 類外初始化,不必再加static關鍵字 為什麼?因為靜態成員屬於整個類,而不屬於某個物件,如果在類內初始化,會導致每個物件都包含該靜態成員,這是矛盾的。能在類中初...