C++類中成員變數的初始化總結
class CA
{
public:
int data;
……
public:
CA();
……
};
CA::CA():data(0)//……#1……初始化列表方式
{
//data = 0;//……#1……賦值方式
};
2、static靜態變數:
static變數屬於類所有,而不屬於類的物件,因此不管類被例項化了多少個物件,該變數都只有一個。在這種性質上理解,有點類似於全域性變數的唯一性。
class CA
{
public:
static int sum;
……
public:
CA();
……
};
int CA::sum=0;//……#2
3、const常量變數:
const常量需要在宣告的時候即初始化。因此需要在變數建立的時候進行初始化。一般採用在建構函式的初始化列表中進行。
class CA
{
public:
const int max;
……
public:
CA();
……
};
CA::CA():max(100)
{
……
}
4、Reference引用型變數:
引用型變數和const變數類似。需要在建立的時候即進行初始化。也是在初始化列表中進行。但需要注意用Reference型別。
class CA
{
public:
int init;
int& counter;
……
public:
CA();
……
};
CA::CA():counter(&init)
{
……
}
5、const 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++裡面是不能定義常量陣列的!因為3和5的矛盾。這個事情似乎說不過去啊?沒有辦法,我只好轉而求助於靜態資料成員。
到此,我的問題解決。但是我還想趁機複習一下C++類的初始化:
1.初始化列表:CSomeClass::CSomeClass() : x(0), y(1){}
2.類外初始化:int CSomeClass::myVar=3;
3.const常量定義必須初始化,C++類裡面使用初始化列表;
4.C++類不能定義常量陣列。