久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2162|回復: 0
收起左側

C++中的靜態成員

[復制鏈接]
ID:108615 發表于 2016-3-13 17:16 | 顯示全部樓層 |閱讀模式
在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();
}
程序將輸出:
DDD
CCC
BBB
AAA


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人一区 | 黄色网址在线免费播放 | 少妇淫片aaaaa毛片叫床爽 | 国产一区在线视频 | av先锋资源| 国产欧美日韩综合精品一 | 欧美视频免费在线观看 | 中文在线播放 | 中文区中文字幕免费看 | 精品综合 | 亚洲一区中文字幕在线观看 | 国产伦一区二区三区视频 | 日韩欧美不卡 | 国产精品无码久久久久 | 国产精品成人av | 精品久久国产 | 日韩av免费在线观看 | 日韩成人av在线 | 日本二区在线观看 | 日本理论片好看理论片 | 成人免费在线观看 | 91久色| 日日碰狠狠躁久久躁婷婷 | 久久9视频| 亚洲在线观看视频 | 国产欧美一区二区精品久导航 | 亚洲电影第三页 | 精品日韩一区二区 | 亚洲精品一区二区三区中文字幕 | 欧美精品日韩 | 亚洲理论在线观看电影 | 国精产品一区一区三区免费完 | 激情国产 | 在线免费观看毛片 | 国产精品一区二区视频 | 欧美一区二区在线 | 一级大片免费 | 在线观看成人免费视频 | 欧美一级免费看 | 欧美精品一区二区三区在线 | 99av成人精品国语自产拍 |