c++類靜態成員的初始化其實不會很難理解,但是我們在開發的時候可能會遇到容易混淆的時候,今天,武林技術頻道小編就來說說詳解C++類的靜態成員初始化的實現方法吧!
記住:通常靜態數據成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時使用作用域操作符來指出靜態成員所屬的類.但如果靜態成員是整型或是枚舉型const,則可以在類聲明中初始化!!!
一般地靜態數據成員在該類定義之外被初始化如同一個成員函數被定義在類定義之外一樣,在這種定義中的靜態成員的名字必須被其類名限定修飾,如上例中的
int test::num = 0;
與全局對象一樣對于靜態數據成員在程序中也只能提供一個定義,這意味著靜態數據成員的初始化不應該被放在頭文件中而應該放在含有類的非inline函數定義的文件中, 靜態數據成員可以被聲明為任意類型它們可以是const 對象數組或類對象等等
?
?
?
private:
static const string name;
};
const string Account::name("Savings Account");
作為特例有序型的const 靜態數據成員可以在類體中用一常量值初始化, 例如如果決定用一個字符數組而不是string 來存儲賬戶的姓名那么我們可以用int型的const數據成員指定該數組的長度例如:
?
?
?
const char Account::name[nameSize]="Savings Account";
于這個特例有一些有趣的事情值得注意, 用常量值作初始化的有序類型的const 靜態數據成員是一個常量表達式constant expression ,如果需要在類體中使用這個被命名的值那么類設計者可聲明這樣的靜態數據成員, 例如因為const 靜態數據成員nameSize是一個常量表達式所以類的設計者可以用它來指定數組數據成員name 的長度, 在類體內初始化一個const 靜態數據成員時該成員必須仍然要被定義在類定義之外
但是因為這個靜態數據成員的初始值是在類體中指定的, 所以在類定義之外的定義不能指定初始值, 因為name 是一個數組不是有序類型所以它不能在類體內被初始化, 任何試圖這么做的行為都會導致編譯時刻錯誤例如:
?
?
name 必須在類定義之外被初始化, 這個例子還說明了一點, 我們注意到成員nameSize指定了數組name 的長度, 而數組name的定義出現在類定義之外,
const char Account::name[nameSize] = "Savings Account";
?
nameSize 沒有被類名Account 限定修飾. 盡管nameSize是私有成員, 但是name的定義仍沒有錯, 怎么會這樣? 如同類成員函數的定義可以引用類的私有成員一樣靜態數據成員的定義也可以引用靜態數據成員, name 的定義是在它的類的域內當限定修飾名Account::name被看到之后它就可以引用Account 的私有數據成員。
以上就是詳解C++類的靜態成員初始化的實現方法,如果你想要知道更多專業知識,去js.Vevb.com進行學習,這里也有很多大家想要學習的知識。
新聞熱點
疑難解答