亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ 類的靜態成員深入解析

2020-01-26 15:48:22
字體:
來源:轉載
供稿:網友

在C++中,靜態成員是屬于整個類的而不是某個對象,靜態成員變量只存儲一份供所有對象共用。所以在所有對象中都可以共享它。使用靜態成員變量實現多個對象之間的數據共享不會破壞隱藏的原則,保證了安全性還可以節省內存。

靜態成員的定義或聲明要加個關鍵static。靜態成員可以通過雙冒號來使用即<類名>::<靜態成員名>。

在C++中類的靜態成員變量和靜態成員函數是個容易出錯的地方,本文先通過幾個例子來總結靜態成員變量和成員函數使用規則,再給出一個實例來加深印象。希望閱讀本文可以使讀者對類的靜態成員變量和成員函數有更為深刻的認識。

第一個例子,通過類名調用靜態成員函數和非靜態成員函數

復制代碼 代碼如下:

class Point
{
public:   
       void init()
       { 
       }
       static void output()
       {
       }
};
void main()
{
       Point::init();
       Point::output();
}

編譯出錯:error C2352: 'Point::init' : illegal call of non-static member function
結論1:不能通過類名來調用類的非靜態成員函數。
 
第二個例子,通過類的對象調用靜態成員函數和非靜態成員函數
將上例的main()改為:
復制代碼 代碼如下:

void main()
{
       Point pt;
       pt.init();
       pt.output();
}

編譯通過。
結論2:類的對象可以使用靜態成員函數和非靜態成員函數。
 
第三個例子,在類的靜態成員函數中使用類的非靜態成員
復制代碼 代碼如下:

#include <stdio.h>
class Point
{
public:   
       void init()
       { 
       }
       static void output()
       {
              printf("%d/n", m_x);
       }
private:
       int m_x;
};
void main()
{
       Point pt;
       pt.output();
}

編譯出錯:error C2597: illegal reference to data member 'Point::m_x' in a static member function
因為靜態成員函數屬于整個類,在類實例化對象之前就已經分配空間了,而類的非靜態成員必須在類實例化對象后才有內存空間,所以這個調用就出錯了,就好比沒有聲明一個變量卻提前使用它一樣。
結論3:靜態成員函數中不能引用非靜態成員。
 
第四個例子,在類的非靜態成員函數中使用類的靜態成員
復制代碼 代碼如下:

class Point
{
public:   
       void init()
       { 
              output();
       }
       static void output()
       {
       }
};
void main()
{
       Point pt;
       pt.output();
}

編譯通過。
結論4:類的非靜態成員函數可以調用用靜態成員函數,但反之不能。

第五個例子,使用類的靜態成員變量
復制代碼 代碼如下:

#include <stdio.h>
class Point
{
public:   
       Point()
       { 
              m_nPointCount++;
       }
       ~Point()
       {
              m_nPointCount--;
       }
       static void output()
       {
              printf("%d/n", m_nPointCount);
       }
private:
       static int m_nPointCount;
};
void main()
{
       Point pt;
       pt.output();
}

按Ctrl+F7編譯無錯誤,按F7生成EXE程序時報鏈接錯誤
error LNK2001: unresolved external symbol "private: static int Point::m_nPointCount" (?m_nPointCount@Point@@0HA)

這是因為類的靜態成員變量在使用前必須先初始化。
在main()函數前加上int Point::m_nPointCount = 0;
再編譯鏈接無錯誤,運行程序將輸出1。
結論5:類的靜態成員變量必須先初始化再使用。
 
結合上面的五個例子,對類的靜態成員變量和成員函數作個總結:
一。靜態成員函數中不能調用非靜態成員。

二。非靜態成員函數中可以調用靜態成員。因為靜態成員屬于類本身,在類的對象產生之前就已經存在了,所以在非靜態成員函數中是可以調用靜態成員的。

三。靜態成員變量使用前必須先初始化(如int MyClass::m_nNumber = 0;),否則會在linker時出錯。

再給一個利用類的靜態成員變量和函數的例子以加深理解,這個例子建立一個學生類,每個學生類的對象將組成一個雙向鏈表,用一個靜態成員變量記錄這個雙向鏈表的表頭,一個靜態成員函數輸出這個雙向鏈表。

復制代碼 代碼如下:

#include <stdio.h>
#include <string.h>
const int MAX_NAME_SIZE = 30; 

class Student 

public: 
    Student(char *pszName);
    ~Student();
public:
       static void PrintfAllStudents();
private: 
    char    m_name[MAX_NAME_SIZE]; 
    Student *next;
       Student *prev;
    static Student *m_head;
}; 

Student::Student(char *pszName)

    strcpy(this->m_name, pszName);

       //建立雙向鏈表,新數據從鏈表頭部插入。
    this->next = m_head;
       this->prev = NULL;
       if (m_head != NULL)
              m_head->prev = this;
    m_head = this; 


Student::~Student ()//析構過程就是節點的脫離過程 

       if (this == m_head) //該節點就是頭節點。
       {
              m_head = this->next;
       }
       else
       {
              this->prev->next = this->next;
              this->next->prev = this->prev;
       }


void Student::PrintfAllStudents()
{
       for (Student *p = m_head; p != NULL; p = p->next)
              printf("%s/n", p->m_name);
}

Student* Student::m_head = NULL; 

void main() 
{  
       Student studentA("AAA");
       Student studentB("BBB");
       Student studentC("CCC");
       Student studentD("DDD");
       Student student("MoreWindows");
       Student::PrintfAllStudents();
}

程序將輸出:



當然在本例還可以增加個靜態成員變量來表示鏈表中學生個數,如果讀者有興趣,就將這個作為小練習吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
米奇精品一区二区三区在线观看| 欧美巨大黑人极品精男| 日韩中文av在线| 热久久这里只有| 欧美老少做受xxxx高潮| 日韩成人小视频| 欧美日韩国产黄| 91探花福利精品国产自产在线| 欧美一级成年大片在线观看| 国产视频精品一区二区三区| 伊人一区二区三区久久精品| 国产成人在线亚洲欧美| 亚州成人av在线| 久久亚洲春色中文字幕| 亚洲aaaaaa| 夜夜嗨av一区二区三区四区| 亚洲国产精品嫩草影院久久| 综合136福利视频在线| 国产一区二区三区直播精品电影| 国产91av在线| 粉嫩老牛aⅴ一区二区三区| 中文字幕欧美亚洲| 亚洲成人av资源网| 亚洲国产精品视频在线观看| 亚洲成人中文字幕| 亚洲最大在线视频| 亚洲精品按摩视频| 5566成人精品视频免费| 亚洲男人天堂2024| 国产视频精品va久久久久久| 精品久久久久久中文字幕大豆网| 91香蕉嫩草影院入口| 91九色在线视频| 色综合视频网站| 日韩高清免费观看| 国内外成人免费激情在线视频网站| 色综合老司机第九色激情| 有码中文亚洲精品| 久久91亚洲精品中文字幕奶水| 美女久久久久久久久久久| 日韩一区二区av| 精品久久在线播放| 国产精品678| 欧美理论电影在线观看| 97视频在线观看播放| 欧美有码在线观看| 国产美女直播视频一区| 日本成人精品在线| 久久久精品视频成人| 永久免费看mv网站入口亚洲| 亚洲精品免费一区二区三区| 色妞欧美日韩在线| 成人久久一区二区三区| 一区二区欧美亚洲| 最近更新的2019中文字幕| 日韩在线视频线视频免费网站| 久久久免费精品视频| 久久不射热爱视频精品| 亚洲第一区第一页| 一本色道久久88综合亚洲精品ⅰ| www.午夜精品| 国产精品女人网站| 久热国产精品视频| 亚洲精品按摩视频| 国产深夜精品福利| 成人国产在线激情| 亚洲天堂开心观看| 成人黄色激情网| 亚洲国产成人精品久久久国产成人一区| 中文字幕精品—区二区| 不卡在线观看电视剧完整版| 国产精品嫩草影院久久久| 欧美亚洲日本网站| 久久6精品影院| 欧美日韩在线免费| 亚洲无线码在线一区观看| 国产欧美日韩免费看aⅴ视频| 欧美激情精品久久久久久黑人| 欧美成人国产va精品日本一级| 国产精品欧美日韩| 欧美天堂在线观看| 欧美日韩一二三四五区| 欧美激情在线狂野欧美精品| 欧美亚洲免费电影| 国产成人亚洲精品| 最近中文字幕2019免费| 狠狠色香婷婷久久亚洲精品| 国产日韩在线视频| 国产精品高清在线观看| 欧美激情视频一区二区| 欧美一区二区三区免费观看| 国产日韩欧美在线视频观看| 亚洲精品电影网| 欧美日韩在线免费| 欧美一级大片在线观看| 8050国产精品久久久久久| 国产日韩av在线| 久久久久久69| 一区二区三区视频在线| 蜜臀久久99精品久久久久久宅男| 中国china体内裑精亚洲片| 日本欧美爱爱爱| 精品国产31久久久久久| 国产精品日韩av| 欧美xxxx18性欧美| 毛片精品免费在线观看| 午夜精品久久久久久99热软件| 国产一区在线播放| 日韩三级影视基地| 精品五月天久久| 亚洲精品女av网站| 日韩中文字幕国产| 久久天天躁狠狠躁夜夜躁2014| 亚洲xxxx在线| 国产v综合v亚洲欧美久久| 欧美在线国产精品| 国产成人一区二区| 日韩成人在线免费观看| 国产精品福利无圣光在线一区| 亚洲国产精品久久久久秋霞不卡| 国产免费一区二区三区在线观看| 国产成人精品一区| 欧美大片大片在线播放| 欧美成人手机在线| 成人久久久久久久| 国产欧美日韩精品丝袜高跟鞋| 最新91在线视频| 亚洲色图狂野欧美| 国产精品一区二区三区在线播放| 国产精品美女久久久免费| 欧美激情一区二区三区高清视频| 亚洲毛片在线观看| 人体精品一二三区| 欧美理论片在线观看| 久久久久免费视频| 欧美精品www| 亚洲精品国精品久久99热一| 久久香蕉频线观| 91老司机精品视频| 精品亚洲一区二区三区四区五区| 国产亚洲精品高潮| 欧美www视频在线观看| 庆余年2免费日韩剧观看大牛| 91免费国产视频| 91在线精品播放| 日韩欧美一区二区三区久久| 全色精品综合影院| 2020国产精品视频| 成人免费观看49www在线观看| 国产69精品久久久久99| 国产精品永久免费观看| 91社影院在线观看| 日韩在线中文视频| 日韩中文在线中文网三级| 久久99久国产精品黄毛片入口| 国产日本欧美一区| 日韩在线视频观看| 国产欧美久久久久久| 欧美激情免费视频| 久久久国产视频| 欧美激情国产精品| 精品动漫一区二区| 国产区精品在线观看| 欧美日韩在线看|