C++類中成員變量的初始化總結

1、普通的變量:一般不考慮啥效率的情況下 可以在構造函數中進行賦值。考慮一下效率的可以再構造函數的初始化列表中進行。

 

class CA

{

public:

int data;

……

public:

CA();

……

 

};

 

CA::CA():data(0)//……#1……初始化列表方式

{

//data = 0;//……#1……賦值方式

};

 

2static 靜態變量:

 

static變量屬於類所有,而不屬於類的對象,因此不管類被實例化了多少個對象,該變量都只有一個。在這種性質上理解,有點類似於全局變量的唯一性。

 

 

class CA

{

public:

static int sum;

……

public:

CA();

……

 

};

 

int CA::sum=0;//……#2……類外進行初始化

 

 

3const 常量變量:

const常量需要在聲明的時候即初始化。因此需要在變量創建的時候進行初始化。一般採用在構造函數的初始化列表中進行。

 

class CA

{

public:

const int max;

……

public:

CA();

……

};

 

CA::CA():max(100)

{

……

}

 

4Reference 引用型變量:

引用型變量和const變量類似。需要在創建的時候即進行初始化。也是在初始化列表中進行。但需要注意用Reference類型。

 

class CA

{

public:

int init;

int& counter;

……

public:

CA();

……

};

 

CA::CA():counter(&init)

{

……

}

 

 

5const static integral 變量:

對於既是const又是static 而且還是整形變量,C++是給予特權的(但是不同的編譯器可能有會有不同的支持,VC 6好像就不支持)。可以直接在類的定義中初始化。short可以,但float的不可以哦。

// 例float類型只能在類外進行初始化

// const float CA::fmin = 3.14;

class CA

{

public:

//static const float fmin = 0.0;// only static const integral data members can be initialized within a class

const static int nmin = 0;

……

public:

……

 

};

 

總結起來,可以初始化的情況有如下四個地方:

1、在類的定義中進行的,只有const  static  integral 的變量。

2、在類的構造函數初始化列表中, 包括const對象和Reference對象。

3、在類的定義之外初始化的,包括static變量。因爲它是屬於類的唯一變量。

4、普通的變量可以在構造函數的內部,通過賦值方式進行。當然這樣效率不高。

 

 

 

類的定義體中只能初始化const integral data型的量。對於static型的量,那就放在.cpp文件中吧!當然了,還不能放在成員函數中,因爲static量是類的,不是某個對象的。那樣的話每個對象都來操作屬於所有對象(類)的東西,豈不是會亂套,所以不能允許這種行爲。
但是,static量可以在類的構造函數中賦值,當然是不可以放在初始化成員列表中的,可是在構造函數中賦值時不可以使用copy construction,提示這樣的錯誤
term does not evaluate to a function taking 1 arguments
那麼,對於類裏面的static函數的聲明和定義是這樣的:
static
函數的聲明可以像普通成員函數一樣聲明,只是在前面加上一個static關鍵字。
如:
private
 
static int GetXYZ();
而在,定義時,像static變量那樣,也是不可以加上static關鍵字,若寫成:
static int A::GetXYZ()
{
…………
}
就會提示:
'static' should not be used on member functions defined at file scope
所以應該寫成是這樣:
int A::GetXYZ()
{//
他是static型函數的性質,就用其他方法來辨別吧,比如在這兒寫上:this is a static function
…………
}
至於static函數的使用,可以再你所編寫的代碼段中這樣插入:
………………
A::GetXYZ();   //
可以看出他是類的東東,不是對象的
………………
當然,對於public型的static量(假設叫CString S_str),可以這樣使用:
A::S_str = "Hello !";
CString  str = A::S_str;

 

 

c++成員變量初始化問題  分類: c/c 小結 2009-11-03 17:19   

 

C++爲類中提供類成員的初始化列表

類對象的構造順序是這樣的:

1.分配內存,調用構造函數時,隱式/顯示的初始化各數據成員

2.進入構造函數後在構造函數中執行一般計算

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

2.一般的數據成員可以在構造函數中初始化。

3.const數據成員必須在構造函數的初始化列表中初始化。

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

5.數組成員是不能在初始化列表裏初始化的。

6.不能給數組指定明顯的初始化。

6條一起,說明了一個問題:C++裏面是不能定義常量數組的!因爲35的矛盾。這個事情似乎說不過去啊?沒有辦法,我只好轉而求助於靜態數據成員。

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

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

2.類外初始化:int CSomeClass::myVar=3;

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

4.C++類不能定義常量數組。

 

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

如果const位於星號的左側,則const就是用來修飾指針所指向的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章