1. 程式人生 > >C++類中成員變數的初始化總結

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

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、在類的定義中進行的,只有conststaticintegral的變數。

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++類不能定義常量陣列。