青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

[轉]靜態(tài)成員數(shù)據(jù)和靜態(tài)成員函數(shù)

在沒有講述本章內(nèi)容之前如果我們想要在一個范圍內(nèi)共享某一個數(shù)據(jù),那么我們會設立全局對象,但面向對象的程序是由對象構成的,我們?nèi)绾尾拍茉陬惙秶鷥?nèi)共享數(shù)據(jù)呢?

  這個問題便是本章的重點:

  聲明為static的類成員或者成員函數(shù)便能在類的范圍內(nèi)共同享,我們把這樣的成員稱做靜態(tài)成員和靜態(tài)成員函數(shù)。
  下面我們用幾個實例來說明這個問題,類的成員需要保護,通常情況下為了不違背類的封裝特性,我們是把類成員設置為protected(保護狀態(tài))的,但是我們?yōu)榱撕喕a,使要說明的問題更為直觀,更容易理解,我們在此處都設置為public。

  以下程序我們來做一個模擬訪問的例子,在程序中,每建立一個對象我們設置的類靜態(tài)成員變自動加一,代碼如下:

#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;就是錯誤的
};

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

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

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

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

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


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

  靜態(tài)成員函數(shù)與普通成員函數(shù)的差別就在于缺少this指針,沒有這個this指針自然也就無從知道name是哪一個對象的成員了。

  根據(jù)類靜態(tài)成員的特性我們可以簡單歸納出幾點,靜態(tài)成員的使用范圍:

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

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

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

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

#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 ()//析構過程就是節(jié)點的脫離過程
{
??? cout<<"析構:"<<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();
}

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

靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問題。實現(xiàn)共享有許多方法,如:設置全局性的變量或對象是一種方法。但是,全局變量或對象是有局限性的。這一章里,我們主要講述類的靜態(tài)成員來實現(xiàn)數(shù)據(jù)的共享。

  靜態(tài)數(shù)據(jù)成員

  在類中,靜態(tài)成員可以實現(xiàn)多個對象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態(tài)成員是類的所有對象中共享的成員,而不是某個對象的成員。

  使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因為它是所有對象所公有的,因此,對多個對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象共用。靜態(tài)數(shù)據(jù)成員的值對每個對象都是一樣,但它的值是可以更新的。只要對靜態(tài)數(shù)據(jù)成員的值更新一次,保證所有對象存取更新后的相同的值,這樣可以提高時間效率。

  靜態(tài)數(shù)據(jù)成員的使用方法和注意事項如下:

  1、靜態(tài)數(shù)據(jù)成員在定義或說明時前面加關鍵字static。

  2、靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式如下:

    <數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>

  這表明:

?????   (1) 初始化在類體外進行,而前面不加static,以免與一般靜態(tài)變量或對象相混淆。

  (2) 初始化時不加該成員的訪問權限控制符private,public等。

  (3) 初始化時使用作用域運算符來標明它所屬類,因此,靜態(tài)數(shù)據(jù)成員是類的成員,而不是對象的成員。

  3、靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲的,它是靜態(tài)生存期,必須對它進行初始化。

  4、引用靜態(tài)數(shù)據(jù)成員時,采用如下格式:

   <類名>::<靜態(tài)成員名>

  如果靜態(tài)數(shù)據(jù)成員的訪問權限允許的話(即public的成員),可在程序中,按上述格式來引用靜態(tài)數(shù)據(jù)成員。

  下面舉一例子,說明靜態(tài)數(shù)據(jù)成員的應用:

#include
class Myclass
{
public:
Myclass(int a, int b, int c);
void GetNumber();
void GetSum();
private:
int A, B, C;
static int Sum;
};

int Myclass::Sum = 0;

Myclass::Myclass(int a, int b, int c)
{
A = a;
B = b;
C = c;
Sum += A+B+C;
}

void Myclass::GetNumber()
{
cout<<"Number="< }

void Myclass::GetSum()
{
cout<<"Sum="< }

void main()
{
Myclass M(3, 7, 10),N(14, 9, 11);
M.GetNumber();
N.GetNumber();
M.GetSum();
N.GetSum();
}


  從輸出結果可以看到Sum的值對M對象和對N對象都是相等的。這是因為在初始化M對象時,將M對象的三個int型數(shù)據(jù)成員的值求和后賦給了Sum,于是Sum保存了該值。在初始化N對象時,對將N對象的三個int型數(shù)據(jù)成員的值求和后又加到Sum已有的值上,于是Sum將保存另后的值。所以,不論是通過對象M還是通過對象N來引用的值都是一樣的,即為54。
靜態(tài)成員函數(shù)

  靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,它們都不是對象成員。因此,對靜態(tài)成員的引用不需要用對象名。

  在靜態(tài)成員函數(shù)的實現(xiàn)中不能直接引用類中說明的非靜態(tài)成員,可以引用類中說明的靜態(tài)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時,可通過對象來引用。下面通過例子來說明這一點。

#include
class M
{
public:
M(int a) { A=a; B+=a;}
static void f1(M m);
private:
int A;
static int B;
};

void M::f1(M m)
{
cout<<"A="< cout<<"B="< }

int M::B=0;
void main()
{
M P(5),Q(10);
M::f1(P); file://調用時不用對象名
M::f1(Q);
}

  讀者可以自行分析其結果。從中可看出,調用靜態(tài)成員函數(shù)使用如下格式:
   <類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>);

posted on 2006-07-31 02:54 Jerry Cat 閱讀(299) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2006年6月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美女日韩在线中文字幕| 美女精品视频一区| 一区二区三区免费观看| 久久精品视频99| 日韩亚洲精品视频| 久久―日本道色综合久久| 国产精品久久久久国产精品日日| 亚洲国产精品成人综合| 老色鬼久久亚洲一区二区 | 夜夜嗨av色一区二区不卡| 久久久久国产一区二区三区| 国产精品一区二区久久久久| 午夜精品久久久99热福利| 亚洲精品日韩在线| 欧美黄色网络| 亚洲久久一区| 日韩写真视频在线观看| 欧美日韩在线电影| 亚洲一区二区网站| 亚洲一区二区三区在线观看视频| 国产精品黄色| 欧美亚洲在线播放| 校园春色综合网| 国产亚洲午夜高清国产拍精品| 久久精品水蜜桃av综合天堂| 欧美中文字幕在线播放| 韩日精品视频一区| 久久久久久亚洲精品中文字幕 | 99re这里只有精品6| 欧美日韩一区精品| 午夜一区二区三视频在线观看| 亚洲男人的天堂在线| 国产精品亚洲аv天堂网| 久久av在线看| 久久在线91| 在线视频欧美精品| 亚洲欧美日韩精品| 狠狠色伊人亚洲综合网站色| 亚洲国产高清在线| 欧美日本不卡| 久久久噜噜噜久久人人看| 欧美一区二区三区在线看 | 美女视频黄a大片欧美| 欧美一区久久| 欧美中文在线观看| 久久久久91| 亚洲欧美激情视频在线观看一区二区三区 | 欧美一区国产一区| 亚洲人成网站在线播| 亚洲三级毛片| 国产欧美日韩另类视频免费观看| 久久噜噜亚洲综合| 欧美日韩亚洲视频一区| 久久精品一二三区| 欧美精品一区二区在线观看| 久久99伊人| 欧美日韩视频一区二区| 美女久久网站| 国产精品裸体一区二区三区| 久久久久久久久久久成人| 欧美精品国产一区| 久久久久久一区二区| 欧美日韩91| 久久久国产91| 欧美视频在线一区二区三区| 欧美成人按摩| 国产欧美在线观看一区| 日韩亚洲在线| 亚洲精品一区二区三区不| 午夜免费在线观看精品视频| 99视频日韩| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲国产欧美日韩精品| 一区二区电影免费观看| 久久国产精品一区二区三区| 欧美高清视频一二三区| 亚洲精品免费一区二区三区| 欧美成人精品在线| 性欧美大战久久久久久久久| 欧美精品网站| 欧美激情第3页| 国内精品久久久久影院 日本资源| 在线视频欧美日韩| 亚洲免费大片| 欧美超级免费视 在线| 免费观看成人www动漫视频| 国产日韩欧美日韩大片| 亚洲字幕在线观看| 亚洲一区日韩| 国产精品二区三区四区| 日韩一区二区精品视频| 久久精品91| 国产精品一区二区三区免费观看| 99精品欧美一区二区蜜桃免费| 91久久国产自产拍夜夜嗨| 久久视频一区| 蜜桃av一区| 亚洲国产精品激情在线观看| 久久视频一区| 亚洲国产综合在线看不卡| 亚洲欧洲日本专区| 欧美国产第二页| 亚洲精品在线二区| 亚洲系列中文字幕| 国产精品成人一区二区三区夜夜夜| 亚洲高清在线观看一区| 99国产一区二区三精品乱码| 欧美日韩在线播放三区| 亚洲一区日韩| 久久久噜噜噜| 亚洲免费观看| 国产精品久久久久久久久搜平片| 亚洲欧美精品在线观看| 久久精品99国产精品日本| 红桃视频一区| 欧美黄色网络| 亚洲男女自偷自拍图片另类| 免费欧美在线视频| 亚洲美女福利视频网站| 欧美色图一区二区三区| 亚洲影视中文字幕| 免播放器亚洲| 在线亚洲免费视频| 国产视频一区在线| 免费观看在线综合色| 一区二区欧美亚洲| 久久天天狠狠| 亚洲图片欧洲图片av| 国产一区欧美日韩| 欧美精品一区二区视频| 欧美一区二区三区四区夜夜大片| 美女露胸一区二区三区| 亚洲小说欧美另类社区| 国内精品国语自产拍在线观看| 欧美国产一区视频在线观看| 亚洲一区二区三区国产| 欧美激情第9页| 久久成人一区二区| 亚洲娇小video精品| 国产精品美女久久久| 美女任你摸久久| 亚洲欧美日韩在线观看a三区| 亚洲国产91| 久久久国产精品一区| 亚洲视频二区| 亚洲人成在线免费观看| 国产亚洲欧美日韩美女| 欧美色欧美亚洲高清在线视频| 久久国产精品一区二区三区四区 | 欧美精品免费看| 欧美一级视频免费在线观看| 亚洲每日在线| 欧美黄在线观看| 久久精品国产综合精品| 亚洲视频福利| 夜夜嗨av一区二区三区中文字幕| 激情久久久久久久| 国产精品久久久久久久久久三级 | 亚洲免费视频网站| 亚洲人成在线观看| 有坂深雪在线一区| 亚洲国产精品第一区二区| 久久久女女女女999久久| 一区二区成人精品| 91久久久亚洲精品| 永久555www成人免费| 国产日韩亚洲| 国产欧美1区2区3区| 国产精品大片wwwwww| 欧美日韩ab片| 欧美日韩午夜剧场| 欧美成人免费全部观看天天性色| 久久久精品国产99久久精品芒果| 新狼窝色av性久久久久久| 亚洲午夜视频| 亚洲一区二区成人在线观看| 一区二区日韩免费看| 亚洲另类自拍| 日韩午夜精品视频| 夜夜嗨av一区二区三区网页| 99精品欧美一区二区三区| 9国产精品视频| 一区二区三区精品国产| 一区二区三区精密机械公司| 亚洲视频一二区| 亚洲综合色自拍一区| 午夜精品视频一区| 久久成人免费网| 美女精品自拍一二三四| 欧美精品一区二区三区很污很色的 | 亚洲精品乱码久久久久久日本蜜臀 | 浪潮色综合久久天堂| 久久婷婷国产综合国色天香| 蜜臀久久99精品久久久画质超高清| 老司机精品视频一区二区三区| 鲁大师影院一区二区三区| 欧美激情在线观看| 国产精品久久7| 国产主播喷水一区二区| 在线观看国产精品网站|