最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 類的靜態(tài)成員深入解析

 更新時間:2013年09月29日 08:48:57   作者:  
在C++中類的靜態(tài)成員變量和靜態(tài)成員函數(shù)是個容易出錯的地方,本文先通過幾個例子來總結(jié)靜態(tài)成員變量和成員函數(shù)使用規(guī)則,再給出一個實例來加深印象

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

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

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

第一個例子,通過類名調(diào)用靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)

復(fù)制代碼 代碼如下:

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
結(jié)論1:不能通過類名來調(diào)用類的非靜態(tài)成員函數(shù)。
 
第二個例子,通過類的對象調(diào)用靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)
將上例的main()改為:
復(fù)制代碼 代碼如下:

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

編譯通過。
結(jié)論2:類的對象可以使用靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。
 
第三個例子,在類的靜態(tài)成員函數(shù)中使用類的非靜態(tài)成員
復(fù)制代碼 代碼如下:

#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
因為靜態(tài)成員函數(shù)屬于整個類,在類實例化對象之前就已經(jīng)分配空間了,而類的非靜態(tài)成員必須在類實例化對象后才有內(nèi)存空間,所以這個調(diào)用就出錯了,就好比沒有聲明一個變量卻提前使用它一樣。
結(jié)論3:靜態(tài)成員函數(shù)中不能引用非靜態(tài)成員。
 
第四個例子,在類的非靜態(tài)成員函數(shù)中使用類的靜態(tài)成員
復(fù)制代碼 代碼如下:

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

編譯通過。
結(jié)論4:類的非靜態(tài)成員函數(shù)可以調(diào)用用靜態(tài)成員函數(shù),但反之不能。

第五個例子,使用類的靜態(tài)成員變量
復(fù)制代碼 代碼如下:

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

這是因為類的靜態(tài)成員變量在使用前必須先初始化。
在main()函數(shù)前加上int Point::m_nPointCount = 0;
再編譯鏈接無錯誤,運行程序?qū)⑤敵?。
結(jié)論5:類的靜態(tài)成員變量必須先初始化再使用。
 
結(jié)合上面的五個例子,對類的靜態(tài)成員變量和成員函數(shù)作個總結(jié):
一。靜態(tài)成員函數(shù)中不能調(diào)用非靜態(tài)成員。

二。非靜態(tài)成員函數(shù)中可以調(diào)用靜態(tài)成員。因為靜態(tài)成員屬于類本身,在類的對象產(chǎn)生之前就已經(jīng)存在了,所以在非靜態(tài)成員函數(shù)中是可以調(diào)用靜態(tài)成員的。

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

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

復(fù)制代碼 代碼如下:

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

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


Student::~Student ()//析構(gòu)過程就是節(jié)點的脫離過程 

       if (this == m_head) //該節(jié)點就是頭節(jié)點。
       {
              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();
}

程序?qū)⑤敵觯?br>


當(dāng)然在本例還可以增加個靜態(tài)成員變量來表示鏈表中學(xué)生個數(shù),如果讀者有興趣,就將這個作為小練習(xí)吧。

相關(guān)文章

  • C語言 main 函數(shù)詳情

    C語言 main 函數(shù)詳情

    這篇文章主要介紹C語言 main 函數(shù),文章將圍繞C語言 main 函數(shù)相關(guān)資料詳細展開,需要的朋友可以參考一下
    2021-10-10
  • C語言實現(xiàn)自行車存放管理系統(tǒng)

    C語言實現(xiàn)自行車存放管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)自行車存放管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Qt6+QML實現(xiàn)Windows屏幕錄制功能

    Qt6+QML實現(xiàn)Windows屏幕錄制功能

    Qt6提供了很多豐富的多媒體支持類,本文將為大家詳細介紹一下Qt6如何結(jié)合QML實現(xiàn)Windows屏幕錄制功能,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下
    2025-04-04
  • C/C++中數(shù)據(jù)類型轉(zhuǎn)換詳解及其作用介紹

    C/C++中數(shù)據(jù)類型轉(zhuǎn)換詳解及其作用介紹

    這篇文章主要介紹了C/C++中數(shù)據(jù)類型轉(zhuǎn)換詳解及其作用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++返回值類型后置實現(xiàn)(跟蹤返回值類型)

    C++返回值類型后置實現(xiàn)(跟蹤返回值類型)

    本文主要介紹了C++返回值類型后置實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言楊氏矩陣中查找元素的示例代碼

    C語言楊氏矩陣中查找元素的示例代碼

    本文主要介紹了C語言楊氏矩陣中查找元素的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Win10+VS2017新CUDA項目配置教程

    Win10+VS2017新CUDA項目配置教程

    這篇文章主要為大家詳細介紹了Win10+VS2017新CUDA項目配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C語言中system()函數(shù)的用法總結(jié)

    C語言中system()函數(shù)的用法總結(jié)

    system()函數(shù)功能強大。以下小編就為大家介紹一下在C語言中system()函數(shù)的用法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C/C++?Qt實現(xiàn)文章小說人物關(guān)系分析

    C/C++?Qt實現(xiàn)文章小說人物關(guān)系分析

    這篇文章主要為大家詳細介紹了C/C++?Qt如何實現(xiàn)文章小說人物關(guān)系分析功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C++實現(xiàn)LeetCode(49.群組錯位詞)

    C++實現(xiàn)LeetCode(49.群組錯位詞)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(49.群組錯位詞),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

桂东县| 广丰县| 武汉市| 镇江市| 绵阳市| 麦盖提县| 廉江市| 三江| 建湖县| 东明县| 九寨沟县| 四子王旗| 蒙城县| 濮阳市| 武陟县| 泽州县| 施秉县| 通江县| 罗甸县| 武隆县| 辰溪县| 青田县| 资溪县| 定南县| 长宁区| 若尔盖县| 宁波市| 新民市| 邵阳市| 浦北县| 太湖县| 高碑店市| 邻水| 龙南县| 华亭县| 泰兴市| 龙口市| 孝感市| 和平区| 进贤县| 如皋市|