C++类静态成员与类静态成员函数
?? ?靜態(tài)成員是類所有的對象的共享的成員,而不是某個對象的成員。它在對象中不占用存儲空間,這個屬性為整個類所共有,不屬于任何一個具體對象。所以靜態(tài)成員不能在類的內(nèi)部初始化,比如聲明一個學(xué)生類,其中一個成員為學(xué)生總數(shù),則這個變量就應(yīng)當(dāng)聲明為靜態(tài)變量,應(yīng)該根據(jù)實際需求來設(shè)置成員變量。
#include "iostream" using namespace std; class test { private: ?? ? int x; ?? ? int y; public: ?? ? static int num; ?? ? static int Getnum() ?? ? { ?? ? ? ? ?x+=5; ? //這行代碼是錯誤的,靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)數(shù)據(jù)成員,要通過類的對象來調(diào)用。 ?? ? ? ? ?num+=15; ?? ? ? ? ?return num; ?? ? } }; int test::num = 10; int main(void) { ?? ? test a; ?? ? cout<<test::num<<endl; ? ? ? ?//10 ?? ? test::num = 20; ?? ? cout<<test::num<<endl; ? ? ? ?//20 ?? ? cout<<test::Getnum()<<endl; ??//35 ?? ? cout<<a.Getnum()<<endl; ? ? ??//50 ?? ? system("pause"); ?? ? return 0; } ?? ?通過上例可知:??x+=5; ? // 這行代碼是錯誤的 ?? ?靜態(tài)函數(shù)成員必須通過對象名來訪問非靜態(tài)數(shù)據(jù)成員。 ?? ?另外,靜態(tài)成員函數(shù)在類外實現(xiàn)時候無須加static關(guān)鍵字,否則是錯誤的。 ?? ?若在類的體外來實現(xiàn)上述的那個靜態(tài)成員函數(shù),不能加static關(guān)鍵字,這樣寫就可以了: ?? ? int test::Getnum() ?? ? { ?? ? ? ......... ?? ? } 1、static成員的所有者是類本身和對象,但是多有對象擁有一樣的靜態(tài)成員。從而在定義對象是不能通過構(gòu)造函數(shù)對其進(jìn)行初始化。 2、靜態(tài)成員不能在類定義里邊初始化,只能在class body外初始化。 3、靜態(tài)成員仍然遵循public,private,protected訪問準(zhǔn)則。 4、靜態(tài)成員函數(shù)沒有this指針,它不能返回非靜態(tài)成員,因為除了對象會調(diào)用它外,類本身也可以調(diào)用。 ?
靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)和函數(shù)成員,而訪問非靜態(tài)數(shù)據(jù)成員必須通過參數(shù)傳遞的方式得到一個對象名,然后通過對象名來訪問。
class Myclass
{
private:
??????? int a,b,c;
??????? static int Sum;??? //聲明靜態(tài)數(shù)據(jù)成員
public:
??????? Myclass(int a,int b,int c);
??????? void GetSum();
};
int Myclass::Sum=0;?????? //定義并初始化靜態(tài)數(shù)據(jù)成員
Myclass::Myclass(int a,int b,int c)
{
??????? this->a=a;
??????? this->b=b;
??????? this->c=c;
??????? Sum+=a+b+c;
}
void Myclass::GetSum()
{
??????? cout <<"Sum=" <<Sum <<endl;
}
int main(void)
{
??????? Myclass me(10,20,30);
??????? me.GetSum();
??????? system("pause");
??????? return 0;
}
?
?
?
由上例可知,非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員。
非靜態(tài)成員函數(shù)Myclass(int a,int b,int c)和GetSum()都訪問了靜態(tài)數(shù)據(jù)成員Sum。
靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)數(shù)據(jù)成員。
?
關(guān)于靜態(tài)成員函數(shù),可以總結(jié)為以下幾點:
出現(xiàn)在類體外的函數(shù)定義不能指定關(guān)鍵字static;
靜態(tài)成員之間可以相互訪問,包括靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員和訪問靜態(tài)成員函數(shù);
非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員;
靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)數(shù)據(jù)成員;
由于沒有this指針的額外開銷,因此靜態(tài)成員函數(shù)與類的全局函數(shù)相比速度上會有少許的增長;
調(diào)用靜態(tài)成員函數(shù),可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調(diào)用靜態(tài)成員函數(shù),
當(dāng)同一類的所有對象使用一個量時,對于這個共用的量,可以用靜態(tài)數(shù)據(jù)成員變量,這個變量對于同一類的所有的對象都取相同的值。靜態(tài)成員變量只能被靜態(tài)成員函數(shù)調(diào)用。靜態(tài)成員函數(shù)也是由同一類中的所有對象共用。只能調(diào)用靜態(tài)成員變量和靜態(tài)成員函數(shù)。
對類的靜態(tài)和非靜態(tài)函數(shù)的不同的調(diào)用要求決定了它們在使用上的方便程度:非靜態(tài)成員函數(shù)要通過對象調(diào)用,所以要求首先建立一個對象;而靜態(tài)成員函數(shù)可不建立對象就可以被使用。因此,與類的非靜態(tài)數(shù)據(jù)成員無關(guān)的成員函數(shù),雖然可以被定義為非靜態(tài)函數(shù),但是如果定義為靜態(tài)函數(shù)的話在使用上會更加方便。
另外,如果類的成員函數(shù)想作為回調(diào)函數(shù)來使用,一般情況下只能將它定義為靜態(tài)成員才行
C++會區(qū)分兩種類型的成員函數(shù):靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。這兩者之間的一個重大區(qū)別是,靜態(tài)成員函數(shù)不接受隱含的this自變量。所以,它就無法訪問自己類的非靜態(tài)成員。
左例中分別聲明了成員函數(shù)void add(),成員變量int a,和靜態(tài)成員函數(shù) static void staticfunc(),靜態(tài)成員變量 static int sa.
在staticfunc()的定義中,由于沒有this指針,所以無法訪問普通成員變量和成員函數(shù).
?
?
?
網(wǎng)絡(luò)上有很多關(guān)于解決靜態(tài)成員函數(shù)訪問普通成員變量的方法,總結(jié)如下:
http://www.360doc.com/content/10/1201/22/963301_74198801.shtml總結(jié)
以上是生活随笔為你收集整理的C++类静态成员与类静态成员函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gulp使用
- 下一篇: 《C++ Primer Plus(第六版