1. 程式人生 > >C++類的靜態成員初始化詳細講解

C++類的靜態成員初始化詳細講解

記住:通常靜態資料成員在類宣告中宣告,在包含類方法的檔案中初始化.初始化時使用作用域操作符來指出靜態成員所屬的類.但如果靜態成員是整型或是列舉型const,則可以在類宣告中初始化!!!

複製程式碼 程式碼如下:
#include <iostream>
using namespace std;
class test
{
public:
static int num;
};
int test::num = 0;
void main()
{
cout<<test::num <<endl;
test::num = 20;
cout<<test::num <<endl;
}

一般地靜態資料成員在該類定義之外被初始化如同一個成員函式被定義在類定義之外一樣,在這種定義中的靜態成員的名字必須被其類名限定修飾,如上例中的
int test::num = 0;

與全域性物件一樣對於靜態資料成員在程式中也只能提供一個定義,這意味著靜態資料成員的初始化不應該被放在標頭檔案中而應該放在含有類的非inline函式定義的檔案中, 靜態資料成員可以被宣告為任意型別它們可以是const 物件陣列或類物件等等
複製程式碼 程式碼如下:
#include <string>
class Account {
// ...

private:
static const string name;
};
const string Account::name("Savings Account");


作為特例有序型的const 靜態資料成員可以在類體中用一常量值初始化, 例如如果決定用一個字元陣列而不是string 來儲存賬戶的姓名那麼我們可以用int型的const資料成員指定該陣列的長度例如:
複製程式碼
程式碼如下:
// 標頭檔案
class Account {
// ...
private:
static const int nameSize = 16;//好像vc下不支援這樣
static const char name[nameSize];
};
// 文字檔案
cons tint Account::nameSize;// 必需的成員定義

const char Account::name[nameSize]="Savings Account";


於這個特例有一些有趣的事情值得注意, 用常量值作初始化的有序型別的const 靜態資料成員是一個常量表達式constant expression ,如果需要在類體中使用這個被命名的值那麼類設計者可宣告這樣的靜態資料成員, 例如因為const 靜態資料成員nameSize是一個常量表達式所以類的設計者可以用它來指定陣列資料成員name 的長度, 在類體內初始化一個const 靜態資料成員時該成員必須仍然要被定義在類定義之外
但是因為這個靜態資料成員的初始值是在類體中指定的, 所以在類定義之外的定義不能指定初始值, 因為name 是一個數組不是有序型別所以它不能在類體內被初始化, 任何試圖這麼做的行為都會導致編譯時刻錯誤例如:
複製程式碼
程式碼如下:
class Account {
// ...
private:
static const int nameSize = 16;// ok: 有序型別
static const char name[nameSize]= "Savings Account";// 錯誤
};

name 必須在類定義之外被初始化, 這個例子還說明了一點, 我們注意到成員nameSize指定了陣列name 的長度, 而陣列name的定義出現在類定義之外,
const char Account::name[nameSize] = "Savings Account";

nameSize 沒有被類名Account 限定修飾. 儘管nameSize是私有成員, 但是name的定義仍沒有錯, 怎麼會這樣? 如同類成員函式的定義可以引用類的私有成員一樣靜態資料成員的定義也可以引用靜態資料成員, name 的定義是在它的類的域內當限定修飾名Account::name被看到之後它就可以引用Account 的私有資料成員。