static 靜態(tài)數(shù)據(jù)成員 靜態(tài)成員函數(shù)
靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問(wèn)題。實(shí)現(xiàn)共享有許多方法,如:設(shè)置全局性的變量或?qū)ο笫且环N方法。但是,全局變量或?qū)ο笫怯芯窒扌缘?。這里主要講述類(lèi)的靜態(tài)成員來(lái)實(shí)現(xiàn)數(shù)據(jù)的共享。
靜態(tài)數(shù)據(jù)成員
在類(lèi)中,靜態(tài)成員可以實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會(huì)破壞隱藏的原則,即保證了安全性。因此,靜態(tài)成員是類(lèi)的所有對(duì)象中共享的成員,而不是某個(gè)對(duì)象的成員。
使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因?yàn)樗撬袑?duì)象所公有的,因此,對(duì)多個(gè)對(duì)象來(lái)說(shuō),靜態(tài)數(shù)據(jù)成員只存儲(chǔ)一處,供所有對(duì)象共用。靜態(tài)數(shù)據(jù)成員的值對(duì)每個(gè)對(duì)象都是一樣,但它的值是可以更新的。只要對(duì)靜態(tài)數(shù)據(jù)成員的值更新一次,保證所有對(duì)象存取更新后的相同的值,這樣可以提高時(shí)間效率。
靜態(tài)數(shù)據(jù)成員的使用方法和注意事項(xiàng)如下:
1、靜態(tài)數(shù)據(jù)成員在定義或說(shuō)明時(shí)前面加關(guān)鍵字static。
2、靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式如下:
<數(shù)據(jù)類(lèi)型><類(lèi)名>::<靜態(tài)數(shù)據(jù)成員名>=<值>
這表明:
(1) 初始化在類(lèi)體外進(jìn)行,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?BR> (2) 初始化時(shí)不加該成員的訪問(wèn)權(quán)限控制符private,public等。
(3) 初始化時(shí)使用作用域運(yùn)算符來(lái)標(biāo)明它所屬類(lèi),因此,靜態(tài)數(shù)據(jù)成員是類(lèi)的成員,而不是對(duì)象的成員。
3、靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲(chǔ)的,它是靜態(tài)生存期,必須對(duì)它進(jìn)行初始化。
4、引用靜態(tài)數(shù)據(jù)成員時(shí),采用如下格式:
<類(lèi)名>::<靜態(tài)成員名>
如果靜態(tài)數(shù)據(jù)成員的訪問(wèn)權(quán)限允許的話(huà)(即public的成員),可在程序中,按上述格式來(lái)引用靜態(tài)數(shù)據(jù)成員。
靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類(lèi)的靜態(tài)成員,它們都不是對(duì)象成員。因此,對(duì)靜態(tài)成員的引用不需要用對(duì)象名。
在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類(lèi)中說(shuō)明的非靜態(tài)成員,可以引用類(lèi)中說(shuō)明的靜態(tài)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時(shí),可通過(guò)對(duì)象來(lái)引用。
C++會(huì)區(qū)分兩種類(lèi)型的成員函數(shù):靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。這兩者之間的一個(gè)重大區(qū)別是,靜態(tài)成員函數(shù)不接受隱含的this自變量。所以,它就無(wú)法訪問(wèn)自己類(lèi)的非靜態(tài)成員。
在某些條件下,比如說(shuō)在使用諸如pthread(它不支持類(lèi))此類(lèi)的多線程庫(kù)時(shí),就必須使用靜態(tài)的成員函數(shù),因?yàn)槠涞刂吠珻語(yǔ)言函數(shù)的地址兼容。這種銅限制就迫使程序員要利用各種解決辦法才能夠從靜態(tài)成員函數(shù)訪問(wèn)到非靜態(tài)數(shù)據(jù)成員。
第一個(gè)解決辦法是聲明類(lèi)的所有數(shù)據(jù)成員都是靜態(tài)的。運(yùn)用這種方式的話(huà),靜態(tài)的成員函數(shù)就能夠直接地訪問(wèn)它們,例如:
class Singleton
{
public:
static Singleton * instance();
private:
Singleton * p;
static Lock lock;
};
Singleton * Singleton::instance()
{
lock.getlock(); // fine, lock is static
if (!p)
p=new Singleton;
lock.unlock();
return p;
}
這種解決方法不適用于需要使用非靜態(tài)數(shù)據(jù)成員的類(lèi)。
訪問(wèn)非靜態(tài)數(shù)據(jù)成員
將參照傳遞給需要考量的對(duì)象能夠讓靜態(tài)的成員函數(shù)訪問(wèn)到對(duì)象的非靜態(tài)數(shù)據(jù):
class A
{
public:
static void func(A & obj);
intgetval() const; //non-static member function
private:
intval;
};
靜態(tài)成員函數(shù)func()會(huì)使用參照obj來(lái)訪問(wèn)非靜態(tài)成員val。
voidA::func(A & obj)
{
int n = obj.getval();
}
將一個(gè)參照或者指針作為靜態(tài)成員函數(shù)的自變量傳遞,就是在模仿自動(dòng)傳遞非靜態(tài)成員函數(shù)里this自變量這一行為。
本文部分來(lái)自作者Danny Kalev ,他是一個(gè)系統(tǒng)分析家、軟件工程師,在C++和面向?qū)ο笤O(shè)計(jì)方面有著14年的專(zhuān)業(yè)經(jīng)驗(yàn)。其他部分來(lái)自網(wǎng)絡(luò),未能一一提及所有的作者,希望見(jiàn)諒。
靜態(tài)成員函數(shù)與普通成員函數(shù)的差別就在于缺少this指針,沒(méi)有這個(gè)this指針自然也就無(wú)從知道name是哪一個(gè)對(duì)象的成員了。
根據(jù)類(lèi)靜態(tài)成員的特性我們可以簡(jiǎn)單歸納出幾點(diǎn),靜態(tài)成員的使用范圍:
1.用來(lái)保存對(duì)象的個(gè)數(shù)。
2.作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開(kāi)狀態(tài),打印機(jī)的使用狀態(tài),等等。
3.存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。
靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問(wèn)題。實(shí)現(xiàn)共享有許多方法,如:設(shè)置全局性的變量或?qū)ο笫且环N方法。但是,全局變量或?qū)ο笫怯芯窒扌缘?。這里主要講述類(lèi)的靜態(tài)成員來(lái)實(shí)現(xiàn)數(shù)據(jù)的共享。
靜態(tài)數(shù)據(jù)成員
在類(lèi)中,靜態(tài)成員可以實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會(huì)破壞隱藏的原則,即保證了安全性。因此,靜態(tài)成員是類(lèi)的所有對(duì)象中共享的成員,而不是某個(gè)對(duì)象的成員。
使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因?yàn)樗撬袑?duì)象所公有的,因此,對(duì)多個(gè)對(duì)象來(lái)說(shuō),靜態(tài)數(shù)據(jù)成員只存儲(chǔ)一處,供所有對(duì)象共用。靜態(tài)數(shù)據(jù)成員的值對(duì)每個(gè)對(duì)象都是一樣,但它的值是可以更新的。只要對(duì)靜態(tài)數(shù)據(jù)成員的值更新一次,保證所有對(duì)象存取更新后的相同的值,這樣可以提高時(shí)間效率。
靜態(tài)數(shù)據(jù)成員的使用方法和注意事項(xiàng)如下:
1、靜態(tài)數(shù)據(jù)成員在定義或說(shuō)明時(shí)前面加關(guān)鍵字static。
2、靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式如下:
<數(shù)據(jù)類(lèi)型><類(lèi)名>::<靜態(tài)數(shù)據(jù)成員名>=<值>
這表明:
(1) 初始化在類(lèi)體外進(jìn)行,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?BR> (2) 初始化時(shí)不加該成員的訪問(wèn)權(quán)限控制符private,public等。
(3) 初始化時(shí)使用作用域運(yùn)算符來(lái)標(biāo)明它所屬類(lèi),因此,靜態(tài)數(shù)據(jù)成員是類(lèi)的成員,而不是對(duì)象的成員。
3、靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲(chǔ)的,它是靜態(tài)生存期,必須對(duì)它進(jìn)行初始化。
4、引用靜態(tài)數(shù)據(jù)成員時(shí),采用如下格式:
<類(lèi)名>::<靜態(tài)成員名>
如果靜態(tài)數(shù)據(jù)成員的訪問(wèn)權(quán)限允許的話(huà)(即public的成員),可在程序中,按上述格式來(lái)引用靜態(tài)數(shù)據(jù)成員。
靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類(lèi)的靜態(tài)成員,它們都不是對(duì)象成員。因此,對(duì)靜態(tài)成員的引用不需要用對(duì)象名。
在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類(lèi)中說(shuō)明的非靜態(tài)成員,可以引用類(lèi)中說(shuō)明的靜態(tài)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時(shí),可通過(guò)對(duì)象來(lái)引用。
C++會(huì)區(qū)分兩種類(lèi)型的成員函數(shù):靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。這兩者之間的一個(gè)重大區(qū)別是,靜態(tài)成員函數(shù)不接受隱含的this自變量。所以,它就無(wú)法訪問(wèn)自己類(lèi)的非靜態(tài)成員。
在某些條件下,比如說(shuō)在使用諸如pthread(它不支持類(lèi))此類(lèi)的多線程庫(kù)時(shí),就必須使用靜態(tài)的成員函數(shù),因?yàn)槠涞刂吠珻語(yǔ)言函數(shù)的地址兼容。這種銅限制就迫使程序員要利用各種解決辦法才能夠從靜態(tài)成員函數(shù)訪問(wèn)到非靜態(tài)數(shù)據(jù)成員。
第一個(gè)解決辦法是聲明類(lèi)的所有數(shù)據(jù)成員都是靜態(tài)的。運(yùn)用這種方式的話(huà),靜態(tài)的成員函數(shù)就能夠直接地訪問(wèn)它們,例如:
class Singleton
{
public:
static Singleton * instance();
private:
Singleton * p;
static Lock lock;
};
Singleton * Singleton::instance()
{
lock.getlock(); // fine, lock is static
if (!p)
p=new Singleton;
lock.unlock();
return p;
}
這種解決方法不適用于需要使用非靜態(tài)數(shù)據(jù)成員的類(lèi)。
訪問(wèn)非靜態(tài)數(shù)據(jù)成員
將參照傳遞給需要考量的對(duì)象能夠讓靜態(tài)的成員函數(shù)訪問(wèn)到對(duì)象的非靜態(tài)數(shù)據(jù):
class A
{
public:
static void func(A & obj);
intgetval() const; //non-static member function
private:
intval;
};
靜態(tài)成員函數(shù)func()會(huì)使用參照obj來(lái)訪問(wèn)非靜態(tài)成員val。
voidA::func(A & obj)
{
int n = obj.getval();
}
將一個(gè)參照或者指針作為靜態(tài)成員函數(shù)的自變量傳遞,就是在模仿自動(dòng)傳遞非靜態(tài)成員函數(shù)里this自變量這一行為。
本文部分來(lái)自作者Danny Kalev ,他是一個(gè)系統(tǒng)分析家、軟件工程師,在C++和面向?qū)ο笤O(shè)計(jì)方面有著14年的專(zhuān)業(yè)經(jīng)驗(yàn)。其他部分來(lái)自網(wǎng)絡(luò),未能一一提及所有的作者,希望見(jiàn)諒。
靜態(tài)成員函數(shù)與普通成員函數(shù)的差別就在于缺少this指針,沒(méi)有這個(gè)this指針自然也就無(wú)從知道name是哪一個(gè)對(duì)象的成員了。
根據(jù)類(lèi)靜態(tài)成員的特性我們可以簡(jiǎn)單歸納出幾點(diǎn),靜態(tài)成員的使用范圍:
1.用來(lái)保存對(duì)象的個(gè)數(shù)。
2.作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開(kāi)狀態(tài),打印機(jī)的使用狀態(tài),等等。
3.存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。