小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

c 類靜態(tài)數(shù)據(jù)成員與類靜態(tài)成員函數(shù)

 funson 2007-04-03
c++類靜態(tài)數(shù)據(jù)成員與類靜態(tài)成員函數(shù)
2006-11-14 10:23:27  作者:ltsc  來源:  瀏覽次數(shù):10  網(wǎng)友評(píng)論0  文字大?。骸?a href="javascript:fontZoom(16)">大】【】【】 評(píng)分等級(jí):0

在沒有講述本章內(nèi)容之前如果我們想要在一個(gè)范圍內(nèi)共享某一個(gè)數(shù)據(jù),那么我們會(huì)設(shè)立全局對(duì)象,但面向?qū)ο蟮某绦蚴怯蓪?duì)象構(gòu)成的,我們?nèi)绾尾拍茉陬惙秶鷥?nèi)共享數(shù)據(jù)呢?

這個(gè)問題便是本章的重點(diǎn):

聲明為static的類成員或者成員函數(shù)便能在類的范圍內(nèi)共同享,我們把這樣的成員稱做靜態(tài)成員和靜態(tài)成員函數(shù)。

下面我們用幾個(gè)實(shí)例來說明這個(gè)問題,類的成員需要保護(hù),通常情況下為了不違背類的封裝特性,我們是把類成員設(shè)置為protected(保護(hù)狀態(tài))的,但是我們?yōu)榱撕?jiǎn)化代碼,使要說明的問題更為直觀,更容易理解,我們?cè)诖颂幎荚O(shè)置為public。

以下程序我們來做一個(gè)模擬訪問的例子,在程序中,每建立一個(gè)對(duì)象我們?cè)O(shè)置的類靜態(tài)成員變自動(dòng)加一,代碼如下:


//程序作者:管寧
//站點(diǎn):www.
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請(qǐng)務(wù)必著名出處和作者

#include <iostream>
using namespace std;

class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
count++;
}
static void Internet::Sc()//靜態(tài)成員函數(shù)
{
cout<<count<<endl;
}
Internet &Rq();
public:
char name[20];
char address[20];
static int count;//這里如果寫成static int count=0;就是錯(cuò)誤的
};

Internet& Internet::Rq()//返回引用的成員函數(shù)
{
return *this;
}

int Internet::count = 0;//靜態(tài)成員的初始化
void vist()
{
Internet a1("中國(guó)軟件開發(fā)實(shí)驗(yàn)室","www.");
Internet a2("中國(guó)軟件開發(fā)實(shí)驗(yàn)室","www.");
}
void fn(Internet &s)
{
cout<<s.Rq().count;
}
void main()
{
cout<<Internet::count<<endl;//靜態(tài)成員值的輸出
vist();
Internet::Sc();//靜態(tài)成員函數(shù)的調(diào)用
Internet b("中國(guó)軟件開發(fā)實(shí)驗(yàn)室","www.");
Internet::Sc();
fn(b);
cin.get();
}


上面代碼我們用了幾種常用的方式建立對(duì)象,當(dāng)建立新對(duì)象并調(diào)用其構(gòu)造函數(shù)的時(shí)候,靜態(tài)成員cout便運(yùn)行加1操作,靜態(tài)成員的初始化應(yīng)該在主函數(shù)調(diào)用之前,并且不能在類的聲明中出現(xiàn),通過運(yùn)行過程的觀察我們發(fā)現(xiàn),靜態(tài)成員count的狀態(tài)并不會(huì)隨著一個(gè)新的對(duì)象的新建而重新定義,盡而我們了解到類的靜態(tài)成員是屬于類的而不是屬于哪一個(gè)對(duì)象的,所以靜態(tài)成員的使用應(yīng)該是類名稱加域區(qū)分符加成員名稱的,在上面的代碼中就是Internet::count,雖然我們?nèi)匀豢梢允褂脤?duì)象名加點(diǎn)操作符號(hào)加成員名稱的方式使用,但是不推薦的,靜態(tài)態(tài)類成員的特性就是屬于類而不專屬于某一個(gè)對(duì)象。

靜態(tài)成員函數(shù)的特性類似于靜態(tài)成員的使用,同樣與對(duì)象無關(guān),調(diào)用方法為類名稱加域區(qū)分符加成員函數(shù)名稱,在上面的代碼中就是Internet::Sc();,靜態(tài)成員函數(shù)由于與對(duì)象無關(guān)系,所以在其中是不能對(duì)類的普通成員進(jìn)行直接操作的。

如果上面的 static void Internet::Sc()修改成為

static void Internet::Sc()//靜態(tài)成員函數(shù)
{
cout<<name<<endl;//錯(cuò)誤
cout<<count<<endl;
}



靜態(tài)成員函數(shù)與普通成員函數(shù)的差別就在于缺少this指針,沒有這個(gè)this指針自然也就無從知道name是哪一個(gè)對(duì)象的成員了。
根據(jù)類靜態(tài)成員的特性我們可以簡(jiǎn)單歸納出幾點(diǎn),靜態(tài)成員的使用范圍:

1.用來保存對(duì)象的個(gè)數(shù)。

2.作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開狀態(tài),打印機(jī)的使用狀態(tài),等等。

3.存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。

為了做一些必要的練習(xí),深入的掌握靜態(tài)對(duì)象的存在的意義,我們以前面的結(jié)構(gòu)體的教程為基礎(chǔ),用類的方式描述一個(gè)線性鏈表,用于存儲(chǔ)若干學(xué)生的姓名,代碼如下:


//程序作者:管寧
//站點(diǎn):www.
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請(qǐng)務(wù)必著名出處和作者

#include <iostream>
using namespace std;

class Student
{
public:
Student (char *name);
~Student();
public:
char name[30];
Student *next;
static Student *point;
};

Student::Student (char *name)
{
strcpy(Student::name,name);
this->next=point;
point=this;
}

Student::~Student ()//析構(gòu)過程就是節(jié)點(diǎn)的脫離過程
{
cout<<"析構(gòu):"<<name<<endl;

if(point==this)
{
point=this->next;
cin.get();
return;
}
for(Student *ps=point;ps;ps=ps->next)
{
if(ps->next==this)
{
cout<<ps->next<<"|"<<this->next<<endl;
ps->next=next;//=next也可以寫成this->next;
cin.get();
return;
}
}
cin.get();
}

Student* Student::point=NULL;
void main()
{
Student *c = new Student("marry");
Student a("colin");
Student b("jamesji");
delete c;
Student *fp=Student::point;
while(fp!=NULL)
{
cout<<fp->name<<endl;
fp=fp->next;
}
cin.get();
}


從上面的代碼來看,原來單純結(jié)構(gòu)化編程需要的一個(gè)鏈表進(jìn)入全局指針在這里被類的靜態(tài)成員指針?biāo)娲?類的靜態(tài)成員完全可以替代全局變量),這個(gè)例子的理解重點(diǎn)主要是要注意觀察類成員的析構(gòu)順序,通過對(duì)析構(gòu)順序的理解,使用析構(gòu)函數(shù)來進(jìn)行節(jié)點(diǎn)的脫鏈操作。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多