【C++深度剖析學習總結】 20 類的靜態(tài)成員變量和類的靜態(tài)成員函數

      網友投稿 641 2022-05-30

      【C++深度剖析學習總結】 20 類的靜態(tài)成員變量和類的靜態(tài)成員函數

      類的靜態(tài)成員變量

      1.成員變量的回顧

      通過對象名能夠訪問public成員變量

      每個對象的成員變量都是專屬的

      成員變量不能在對象之間共享

      2.新的需求

      統(tǒng)計在程序運行期間某個類的對象數目

      保證程序的安全性(不能使用全局變量)

      隨時可以獲取當前對象的數目

      實驗1 解決方案的嘗試(失敗的解決方案)

      #include class Test { private: int mCount; public: Test() : mCount(0) { mCount++; } ~Test() { --mCount; } int getCount() { return mCount; } }; Test gTest; int main() { Test t1; Test t2; printf("count = %d\n", gTest.getCount()); printf("count = %d\n", t1.getCount()); printf("count = %d\n", t2.getCount()); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      3.靜態(tài)成員變量—開始介紹新概念

      在C++中可以定義靜態(tài)成員變量

      靜態(tài)成員變量屬于整個類所有

      靜態(tài)成員變量的生命期不依賴于任何對象

      可以通過類名直接訪問公有靜態(tài)成員變量

      所有對象共享類的靜態(tài)成員變量

      可以通過對象名訪問公有靜態(tài)成員變量

      靜態(tài)成員變量的特性

      在定義時直接通過static關鍵字修飾

      靜態(tài)成員變量需要在類外單獨分配空間

      靜態(tài)成員變量在程序內部位于全局數據區(qū)

      語法規(guī)則:

      Type ClassName::VarName = value;

      實驗2 靜態(tài)成員變量的使用

      #include class Test { private: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } int getCount() { return cCount; } }; int Test::cCount = 0; //需要在類的外部單獨定義,隸屬于test Test gTest; int main() { Test t1; Test t2; printf("count = %d\n", gTest.getCount()); printf("count = %d\n", t1.getCount()); printf("count = %d\n", t2.getCount()); Test* pt = new Test(); //指向堆上的一個指針對象,動態(tài)生成,觸發(fā)構造函數就 ++,輸出為4 printf("count = %d\n", pt->getCount()); delete pt; printf("count = %d\n", gTest.getCount()); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      小結

      類中可以通過static關鍵定義靜態(tài)成員變量

      靜態(tài)成員變量隸屬于類所有

      每一個對象都可以訪問靜態(tài)成員變量

      靜態(tài)成員變量在全局數據區(qū)分配空間

      靜態(tài)成員變量的生命期為程序運行期

      類的靜態(tài)成員函數

      1.未完成的需求

      統(tǒng)計在程序運行期間某個類的對象數目

      保證程序的安全性(不能使用全局變量)

      隨時可以獲取當前對象的數目(Failure)

      實驗1 解決方案的嘗試

      【C++深度剖析學習總結】 20 類的靜態(tài)成員變量和類的靜態(tài)成員函數

      #include class Test { public: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } int getCount() { return cCount; } }; int Test::cCount = 0; int main() { printf("count = %d\n", Test::cCount); //直接打印類名 Test::cCount = 1000; //怎么明顯也是不符合安全性的要求 printf("count = %d\n", Test::cCount); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      運行結果

      count = 0

      count = 1000

      2.問題分析

      我們需要什么?

      不依賴對象就可以訪問靜態(tài)成員變量

      必須保證靜態(tài)成員變量的安全性

      方便快捷的獲取靜態(tài)成員變量的值

      3.靜態(tài)成員函數

      在C++中可以定義靜態(tài)成員函數

      靜態(tài)成員函數是類中特殊的成員函數

      靜態(tài)成員函數屬于整個類所有

      可以通過類名直接訪問公有靜態(tài)成員函數

      可以通過對象名訪問公有靜態(tài)成員函數

      靜態(tài)成員函數的定義

      直接通過static關鍵字修飾成員函數

      實驗2 靜態(tài)成員函數

      靜態(tài)成員函數VS普通成員函數

      #include class Demo { private: int i; public: int getI(); static void StaticFunc(const char* s); static void StaticSetI(Demo& d, int v); }; int Demo::getI() { return i; } void Demo::StaticFunc(const char* s) { printf("StaticFunc: %s\n", s); } void Demo::StaticSetI(Demo& d, int v) { d.i = v; } int main() { Demo::StaticFunc("main Begin..."); Demo d; Demo::StaticSetI(d, 10); printf("d.i = %d\n", d.getI()); Demo::StaticFunc("main End..."); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      運行結果

      StaticFunc: main Begin…

      d.i = 10

      StaticFunc: main End…

      實驗3 最后的解決方案

      #include class Test { private: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } static int GetCount() { return cCount; } }; int Test::cCount = 0; int main() { printf("count = %d\n", Test::GetCount()); Test t1; Test t2; printf("count = %d\n", t1.GetCount()); printf("count = %d\n", t2.GetCount()); Test* pt = new Test(); printf("count = %d\n", pt->GetCount()); delete pt; printf("count = %d\n", Test::GetCount()); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      運行結果

      count = 2

      count = 2

      count = 3

      count = 2

      小結

      靜態(tài)成員函數是類中特殊的成員函數

      靜態(tài)成員函數沒有隱藏的this參數

      靜態(tài)成員函數可以通過類名直接訪問

      靜態(tài)成員函數只能直接訪問靜態(tài)成員變量(函數)

      C++

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:華為云IoT智簡聯接,加速行業(yè)智能升級
      下一篇:基于華為TICS實現聯合風控模型訓練
      相關文章
      亚洲狠狠成人综合网| 日韩亚洲国产综合高清| 亚洲精品国产suv一区88| 亚洲中文字幕在线无码一区二区| 亚洲福利在线观看| 亚洲欧洲一区二区| 久久精品国产精品亚洲蜜月| 亚洲AV天天做在线观看| 亚洲AV人无码综合在线观看| 久久精品国产亚洲AV果冻传媒| 狠狠色伊人亚洲综合成人| 亚洲日本一区二区三区在线 | 亚洲精品亚洲人成人网| 精品亚洲视频在线观看| 久久久久噜噜噜亚洲熟女综合| 亚洲综合国产精品第一页| 国产精品V亚洲精品V日韩精品| 亚洲精品成人片在线观看| 亚洲性日韩精品一区二区三区| 久久久亚洲精品蜜桃臀| 亚洲中文久久精品无码ww16| 亚洲精品国偷自产在线| 亚洲成a人片在线观看中文动漫 | 激情内射亚洲一区二区三区爱妻| 亚洲精品二三区伊人久久| 亚洲高清有码中文字| 亚洲精品av无码喷奶水糖心| 久久亚洲精品高潮综合色a片| 一本色道久久88综合亚洲精品高清| www国产亚洲精品久久久日本| 亚洲国产午夜福利在线播放| 中文字幕亚洲专区| 久久久久久亚洲av成人无码国产| 亚洲综合在线观看视频| 91亚洲精品自在在线观看| 亚洲熟妇丰满xxxxx| 国产亚洲美女精品久久| 国产亚洲精品拍拍拍拍拍| 亚洲国产精品嫩草影院在线观看| 日木av无码专区亚洲av毛片| 亚洲jjzzjjzz在线观看|