類的靜態(tài)成員變量
在類的成員聲明之前加上關(guān)鍵字
static
使其與類關(guān)聯(lián)在一起才写。成為類的靜態(tài)成員
類型
靜態(tài)成員可以是常量他宛、引用、指針换况,類類型职辨。幾乎是可以任何定義的類型。(除了函數(shù)戈二?)
內(nèi)存模型
類的靜態(tài)成員存在于任何對象之外舒裤,它不在類實例所在的那塊內(nèi)存中(存在data段?)觉吭。
![Upload image.png failed. Please try again.]
與普通數(shù)據(jù)成員的區(qū)別
- 靜態(tài)數(shù)據(jù)成員可以是不完全類型腾供。
//此時B是一個不完全類型
class B;
class A
{
B a;//報錯
static B;//正常
};
- 類的常量靜態(tài)成員可以作為類的函數(shù)的默認(rèn)實參
因為,靜態(tài)成員在程序運行時就聲明了鲜滩,而常量的更是直接定義了伴鳖。
————
不完全類型
一個類在聲明之后,定義之前徙硅,這段期間就是一個不完全類型榜聂。
此時,普通數(shù)據(jù)成員可以定義不完全類型的引用嗓蘑,和指針须肆。
但是匿乃,靜態(tài)數(shù)據(jù)成員可以定義不完全類型的值。
————
類的靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)不與本對象綁定在一起(也不與任何對象綁定在一起)豌汇。
因此不包含this
指針幢炸。不能聲明為const
函數(shù)。
————
類const函數(shù)
指的是類中函數(shù)不能改變類的數(shù)據(jù)成員拒贱。在編譯期會報錯宛徊。
其定義和實現(xiàn)都需要加上const
關(guān)鍵字。
//定義
class A
{
int getSomething() const;
};
//實現(xiàn)
int A::getSomething() const
{
};
————
靜態(tài)成員函數(shù)的聲明和定義
靜態(tài)函數(shù)成員
靜態(tài)函數(shù)成員逻澳,可以在類內(nèi)部定義闸天,也可以在定義。
但必須在內(nèi)類聲明赡盘。
當(dāng)在類外部定義函數(shù)時号枕,不能重復(fù)static
,否則會在編譯器報錯陨享。
error: cannot declare member function 'static int A::set()' to have static linkage [-fpermissive]
static int A::set()
靜態(tài)數(shù)據(jù)成員
類的靜態(tài)成員不屬于類的一部分葱淳,所以他不能由類的構(gòu)造函數(shù)初始化。
在類內(nèi)聲明抛姑,在類外定義赞厕。
不能再類內(nèi)聲明和定義。
程序運行時定硝,靜態(tài)數(shù)據(jù)成員定義在任何函數(shù)之外皿桑,因此一旦被定義,就會一直存在于程序的整個生命周期蔬啡。
類的靜態(tài)數(shù)據(jù)成員诲侮,可以使用類的靜態(tài)函數(shù)成員來初始化。
class A
{
static int i;
static int set();
};
//定義&初始化
int A::set()
{
return 0;
}
//使用靜態(tài)函數(shù)初始化靜態(tài)數(shù)據(jù)
int A::i=set();
初始化的語句箱蟆,只要第一個加上A::
那么剩下的部分都是在類的作用域之內(nèi)了沟绪。
繼承與靜態(tài)成員
基類靜態(tài)成員在整個集成體系中只存在該成員的唯一定義。
局部靜態(tài)對象
函數(shù)中定義的
static
成員
局部鼎泰對象在程序執(zhí)行路徑第一次經(jīng)過對象定義語句時初始化空猜,并且直到程序終止才被銷毀绽慈,在此期間,對象所在的函數(shù)結(jié)束執(zhí)行也不會對他有影響辈毯。