C++類的靜態(tài)成員初始化詳細(xì)講解
記?。?/FONT>通常靜態(tài)數(shù)據(jù)成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時(shí)使用作用域操作符來指出靜態(tài)成員所屬的類.但如果靜態(tài)成員是整型或是枚舉型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;
}
一般地靜態(tài)數(shù)據(jù)成員在該類定義之外被初始化如同一個(gè)成員函數(shù)被定義在類定義之外一樣,在這種定義中的靜態(tài)成員的名字必須被其類名限定修飾,如上例中的
int test::num = 0;
與全局對(duì)象一樣對(duì)于靜態(tài)數(shù)據(jù)成員在程序中也只能提供一個(gè)定義,這意味著靜態(tài)數(shù)據(jù)成員的初始化不應(yīng)該被放在頭文件中而應(yīng)該放在含有類的非inline函數(shù)定義的文件中, 靜態(tài)數(shù)據(jù)成員可以被聲明為任意類型它們可以是const 對(duì)象數(shù)組或類對(duì)象等等
#include <string>
class Account {
// ...
private:
static const string name;
};
const string Account::name("Savings Account");
作為特例有序型的const 靜態(tài)數(shù)據(jù)成員可以在類體中用一常量值初始化, 例如如果決定用一個(gè)字符數(shù)組而不是string 來存儲(chǔ)賬戶的姓名那么我們可以用int型的const數(shù)據(jù)成員指定該數(shù)組的長(zhǎng)度例如:
// 頭文件
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";
于這個(gè)特例有一些有趣的事情值得注意, 用常量值作初始化的有序類型的const 靜態(tài)數(shù)據(jù)成員是一個(gè)常量表達(dá)式constant expression ,如果需要在類體中使用這個(gè)被命名的值那么類設(shè)計(jì)者可聲明這樣的靜態(tài)數(shù)據(jù)成員, 例如因?yàn)閏onst 靜態(tài)數(shù)據(jù)成員nameSize是一個(gè)常量表達(dá)式所以類的設(shè)計(jì)者可以用它來指定數(shù)組數(shù)據(jù)成員name 的長(zhǎng)度, 在類體內(nèi)初始化一個(gè)const 靜態(tài)數(shù)據(jù)成員時(shí)該成員必須仍然要被定義在類定義之外
但是因?yàn)檫@個(gè)靜態(tài)數(shù)據(jù)成員的初始值是在類體中指定的, 所以在類定義之外的定義不能指定初始值, 因?yàn)閚ame 是一個(gè)數(shù)組不是有序類型所以它不能在類體內(nèi)被初始化, 任何試圖這么做的行為都會(huì)導(dǎo)致編譯時(shí)刻錯(cuò)誤例如:
class Account {
// ...
private:
static const int nameSize = 16;// ok: 有序類型
static const char name[nameSize]= "Savings Account";// 錯(cuò)誤
};
name 必須在類定義之外被初始化, 這個(gè)例子還說明了一點(diǎn), 我們注意到成員nameSize指定了數(shù)組name 的長(zhǎng)度, 而數(shù)組name的定義出現(xiàn)在類定義之外,
const char Account::name[nameSize] = "Savings Account";
nameSize 沒有被類名Account 限定修飾. 盡管nameSize是私有成員, 但是name的定義仍沒有錯(cuò), 怎么會(huì)這樣? 如同類成員函數(shù)的定義可以引用類的私有成員一樣靜態(tài)數(shù)據(jù)成員的定義也可以引用靜態(tài)數(shù)據(jù)成員, name 的定義是在它的類的域內(nèi)當(dāng)限定修飾名Account::name被看到之后它就可以引用Account 的私有數(shù)據(jù)成員。
相關(guān)文章
Visual Studio 2019 如何新建 Win32項(xiàng)目的方法步驟
這篇文章主要介紹了Visual Studio 2019 如何新建 Win32項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
VC6.0打開文件以及向工程中添加文件時(shí)程序崩潰自動(dòng)退出解決方法
vc6.0程序中,點(diǎn)擊打開文件以及向工程中添加文件時(shí),程序竟然崩潰自動(dòng)退出了,不知什么原因,安裝相同的vc程序,本本竟然出現(xiàn)此緣故2013-01-01
C語言使用posix正則表達(dá)式庫(kù)的實(shí)現(xiàn)
在C語言中,你可以使用 POSIX 正則表達(dá)式庫(kù)(regex.h)來進(jìn)行正則表達(dá)式的模式匹配,本文主要介紹了C語言使用posix正則表達(dá)式庫(kù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
詳解散列表算法與其相關(guān)的C語言實(shí)現(xiàn)
這篇文章主要介紹了詳解散列表算法與其相關(guān)的C語言實(shí)現(xiàn),平時(shí)經(jīng)常出現(xiàn)于各大考試競(jìng)賽與程序員面試題目當(dāng)中,需要的朋友可以參考下2015-08-08
C語言連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C語言連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法,實(shí)例分析了C語言操作XML文件的相關(guān)技巧,需要的朋友可以參考下2015-06-06

