c++ 類數據成員的定義、聲明


 

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  x
 2 
 3  {
 4     int  i; 
 6     int  j;
 7 
 8  public  :
 9    x(  int  value):j(value),i(j)
10    {
11    }
12  } 
復制代碼

 

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

 

 

補充1:

    類非靜態成員變量內部初始化是在構造函數中進行,而對於類的靜態成員變量,由於其屬於類為所有類對象所共有,但不屬於任何一個對象,所以不能在類的構造函數中初始化,因為類的構造函數是在定義類的對象時候調用的,而定義類的時候還沒有類對象呢,因此類的靜態成員變量不能在類內部初始化,只能在類外。

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

 

 

補充2:

類中的對象成員的定義和初始化:

1、對象成員初始化時,必須有相應的構造函數,且多個對象成員的構造次序不是按初始化成員列表的順序,而是按各類聲明的先后次序進行的

2、成員對象初始化可在類構造函數定義時進行

 

class CRect  
{  
public:  
CRect(int left, int top, int right, int bottom);  
void Show() {  
ptCenter.ShowPos();  
size.ShowSize();  
}  
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)  
{  
} 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM