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

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

[轉]靜態成員數據和靜態成員函數

在沒有講述本章內容之前如果我們想要在一個范圍內共享某一個數據,那么我們會設立全局對象,但面向對象的程序是由對象構成的,我們如何才能在類范圍內共享數據呢?

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

  聲明為static的類成員或者成員函數便能在類的范圍內共同享,我們把這樣的成員稱做靜態成員和靜態成員函數。
  下面我們用幾個實例來說明這個問題,類的成員需要保護,通常情況下為了不違背類的封裝特性,我們是把類成員設置為protected(保護狀態)的,但是我們為了簡化代碼,使要說明的問題更為直觀,更容易理解,我們在此處都設置為public。

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

#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()//靜態成員函數
??? {
??????? cout<<count<<endl;
??? }
??? Internet &Rq();
public:
??? char name[20];
??? char address[20];
??? static int count;//這里如果寫成static int count=0;就是錯誤的
};

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

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

  上面代碼我們用了幾種常用的方式建立對象,當建立新對象并調用其構造函數的時候,靜態成員cout便運行加1操作,靜態成員的初始化應該在主函數調用之前,并且不能在類的聲明中出現,通過運行過程的觀察我們發現,靜態成員count的狀態并不會隨著一個新的對象的新建而重新定義,盡而我們了解到類的靜態成員是屬于類的而不是屬于哪一個對象的,所以靜態成員的使用應該是類名稱加域區分符加成員名稱的,在上面的代碼中就是Internet::count,雖然我們仍然可以使用對象名加點操作符號加成員名稱的方式使用,但是不推薦的,靜態態類成員的特性就是屬于類而不專屬于某一個對象。

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

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


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

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

  根據類靜態成員的特性我們可以簡單歸納出幾點,靜態成員的使用范圍:

  1.用來保存對象的個數。

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

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

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

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

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

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

  靜態數據成員

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

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

  靜態數據成員的使用方法和注意事項如下:

  1、靜態數據成員在定義或說明時前面加關鍵字static。

  2、靜態成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式如下:

    <數據類型><類名>::<靜態數據成員名>=<值>

  這表明:

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

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

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

  3、靜態數據成員是靜態存儲的,它是靜態生存期,必須對它進行初始化。

  4、引用靜態數據成員時,采用如下格式:

   <類名>::<靜態成員名>

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

  下面舉一例子,說明靜態數據成員的應用:

#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型數據成員的值求和后賦給了Sum,于是Sum保存了該值。在初始化N對象時,對將N對象的三個int型數據成員的值求和后又加到Sum已有的值上,于是Sum將保存另后的值。所以,不論是通過對象M還是通過對象N來引用的值都是一樣的,即為54。
靜態成員函數

  靜態成員函數和靜態數據成員一樣,它們都屬于類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。

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

#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);
}

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

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

<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(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>
            欧美视频在线一区二区三区| 亚洲一区二区三区精品视频| 亚洲免费观看高清在线观看| 又紧又大又爽精品一区二区| 国产原创一区二区| 国产欧美日韩一区二区三区在线观看 | 欧美日韩成人激情| 欧美日韩在线观看一区二区| 国产精品高潮呻吟视频| 国产精品久久久久久亚洲毛片| 国产精品亚洲不卡a| 久久九九久精品国产免费直播| 亚洲日本无吗高清不卡| 亚洲经典三级| 一区二区三区四区五区视频| 欧美在线一二三四区| 久久永久免费| 一本色道久久88亚洲综合88| 欧美在线看片| 欧美日韩国产精品一区| 国产乱码精品一区二区三区忘忧草 | 午夜老司机精品| 久久青草欧美一区二区三区| 亚洲精品乱码久久久久久按摩观| 一区二区激情| 久久久久久久综合| 欧美视频一区二区三区在线观看| 国产在线观看一区| 亚洲午夜成aⅴ人片| 久久亚洲欧美| 正在播放亚洲| 美女黄毛**国产精品啪啪| 国产精品草草| 亚洲精品五月天| 久久综合狠狠综合久久激情| 中文在线不卡| 欧美精品自拍偷拍动漫精品| 黄色成人片子| 欧美一区二区三区在线| 日韩午夜黄色| 欧美华人在线视频| 在线观看视频一区二区| 久久精品视频网| 亚洲天堂激情| 国产精品99免费看| 一本色道久久99精品综合| 男同欧美伦乱| 欧美在线精品一区| 国产视频亚洲精品| 欧美一级成年大片在线观看| a4yy欧美一区二区三区| 欧美精品v日韩精品v韩国精品v | 亚洲另类自拍| 欧美精品麻豆| 一区二区三区国产盗摄| 亚洲国产精品99久久久久久久久| 久久久免费av| 在线成人小视频| 免费观看一级特黄欧美大片| 久久国产精品久久久久久电车| 国内久久精品视频| 蜜桃av噜噜一区| 麻豆精品精品国产自在97香蕉| 在线视频成人| 国产欧美日韩视频一区二区| 国产精品久久亚洲7777| 亚洲欧美日韩国产精品| 亚洲欧洲一区二区三区| 欧美日韩p片| 亚洲特级毛片| 一区二区三区免费看| 国产精品多人| 欧美一区在线视频| 久久高清福利视频| 亚洲国产天堂久久综合| 亚洲欧洲综合另类在线| 欧美日韩免费高清| 欧美一区日韩一区| 久久先锋影音| 一区二区日韩精品| 香蕉视频成人在线观看| 在线观看亚洲视频啊啊啊啊| 亚洲福利视频三区| 欧美日韩中文字幕日韩欧美| 香蕉久久久久久久av网站| 性高湖久久久久久久久| 亚洲区在线播放| 亚洲一二三四久久| 黄色国产精品| 日韩视频一区二区三区在线播放| 国产色综合天天综合网| 欧美激情一二三区| 国产精品免费看片| 免费中文日韩| 国产精品日韩久久久| 欧美不卡在线视频| 国产精品国产三级国产专播品爱网 | 久久久久www| 日韩视频免费| 亚洲欧美一区二区三区极速播放| 在线播放不卡| 在线综合视频| 在线日韩成人| 中文日韩在线| 亚洲区第一页| 久久精品国产综合精品| 一本大道久久a久久精品综合| 午夜精品福利视频| 正在播放亚洲| 美女任你摸久久| 久久影院亚洲| 国产亚洲精品久久久久久| 亚洲精品影视| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久久精彩视频| 欧美日韩无遮挡| 亚洲国产精品视频一区| 国模精品一区二区三区| 一区二区三区视频免费在线观看| 亚洲破处大片| 久久人人九九| 亚洲毛片网站| 免费永久网站黄欧美| 欧美国产日产韩国视频| 欧美视频一区在线观看| 蜜臀av一级做a爰片久久| 欧美午夜电影一区| 欧美成人精品福利| 国产精品亚洲аv天堂网| 一本大道av伊人久久综合| 在线观看日韩专区| 久久精品国产亚洲5555| 久久精品91| 国产日韩欧美91| 亚洲欧美日韩中文在线制服| 亚洲免费在线电影| 欧美视频久久| 亚洲高清色综合| 在线日韩一区二区| 久久久久九九九| 欧美大香线蕉线伊人久久国产精品| 狠狠色综合网| 久久一综合视频| 欧美www视频| 在线观看国产一区二区| 欧美一区二区三区在线| 久久精品成人一区二区三区| 国产亚洲精品aa| 亚洲欧美99| 久久精品三级| 亚洲福利国产精品| 欧美成人免费网| 亚洲美女尤物影院| 亚洲免费视频网站| 国产精品一卡二| 欧美尤物巨大精品爽| 老**午夜毛片一区二区三区| 在线观看亚洲专区| 欧美另类极品videosbest最新版本 | 亚洲性感激情| 国产精品xxx在线观看www| 亚洲欧美激情四射在线日 | 老牛影视一区二区三区| 亚洲高清不卡| 欧美日韩午夜精品| 欧美一区二区黄| 欧美成人午夜激情视频| 国产精品99久久久久久久vr | 午夜电影亚洲| 狠狠入ady亚洲精品| 欧美激情网友自拍| 亚洲一级在线| 欧美成人精品激情在线观看| 一区二区三欧美| 在线视频亚洲| 美女黄网久久| 亚洲摸下面视频| 伊人天天综合| 欧美午夜精品久久久| 久久久久高清| 宅男噜噜噜66国产日韩在线观看| 久久久噜噜噜久噜久久| 国产精品99久久久久久白浆小说 | 欧美一区二区黄色| 亚洲精选成人| 蜜臀av在线播放一区二区三区| 亚洲性感激情| 亚洲人成绝费网站色www| 国产手机视频精品| 欧美日本在线看| 久久久久在线观看| 亚洲欧美国产高清| 亚洲精品久久久久中文字幕欢迎你| 欧美在线视频日韩| 亚洲一区在线观看视频| 99精品黄色片免费大全| 在线不卡亚洲| 狠狠色狠狠色综合日日tαg| 国产伦精品一区二区| 欧美色欧美亚洲另类二区|