基礎備忘:C++類靜態成員與類靜態成員函數詳解

      網友投稿 1385 2022-05-29

      靜態成員不可在類體內進行賦值,因為它是被所有該類的對象所共享的。你在一個對象里給它賦值,其他對象里的該成員也會發生變化。為了避免混亂,所以不可在類體內進行賦值

      當將類的某個數據成員聲明為static時,該靜態數據成員只能被定義一次,而且要被同類的所有對象共享。各個對象都擁有類中每一個普通數據成員的副本,但靜態數據成員只有一個實例存在,與定義了多少類對象無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的實例對象相關。

      靜態數據成員的用途之一是統計有多少個對象實際存在。

      靜態數據成員不能在類中初始化,實際上類定義只是在描述對象的藍圖,在其中指定初值是不允許的。也不能在類的構造函數中初始化該成員,因為靜態數據成員為類的各個對象共享,否則每次創建一個類的對象則靜態數據成員都要被重新初始化。

      靜態成員不可在類體內進行賦值,因為它是被所有該類的對象所共享的。你在一個對象里給它賦值,其他對象里的該成員也會發生變化。為了避免混亂,所以不可在類體內進行賦值。

      靜態成員的值對所有的對象是一樣的。靜態成員可以被初始化,但只能在類體外進行初始化。

      一般形式:

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

      注意:不能用參數初始化表對靜態成員初始化。一般系統缺省初始為0。

      靜態成員是類所有的對象的共享的成員,而不是某個對象的成員。它在對象中不占用存儲空間,這個屬性為整個類所共有,不屬于任何一個具體對象。所以靜態成員不能在類的內部初始化,比如聲明一個學生類,其中一個成員為學生總數,則這個變量就應當聲明為靜態變量,應該根據實際需求來設置成員變量。

      復制代碼

      代碼如下:

      #include "iostream"

      using namespace std;

      class test

      {

      private:

      int x;

      int y;

      public:

      static int num;

      static int Getnum()

      {

      x+=5;?? // 這行代碼是錯誤的,靜態成員函數不能調用非靜態數據成員,要通過類的對象來調用。

      num+=15;

      return num;

      }

      };

      int test::num = 10;

      int main(void)

      {

      test a;

      cout<

      test::num = 20;

      cout<

      cout<

      cout<

      system("pause");

      return 0;

      }

      復制代碼

      代碼如下:

      int test::Getnum()

      {

      .........

      }

      2、靜態成員不能在類定義里邊初始化,只能在class body外初始化。

      3、靜態成員仍然遵循public,private,protected訪問準則。

      4、靜態成員函數沒有this指針,它不能返回非靜態成員,因為除了對象會調用它外,類本身也可以調用。

      靜態成員函數可以直接訪問該類的靜態數據和函數成員,而訪問非靜態數據成員必須通過參數傳遞的方式得到一個對象名,然后通過對象名來訪問。

      復制代碼

      代碼如下:

      class Myclass

      {

      private:

      int a,b,c;

      static int Sum;??? //聲明靜態數據成員

      public:

      Myclass(int a,int b,int c);

      void GetSum();

      基礎備忘:C++類靜態成員與類靜態成員函數詳解

      };

      int Myclass::Sum=0;?????? //定義并初始化靜態數據成員

      Myclass::Myclass(int a,int b,int c)

      {

      this->a=a;

      this->b=b;

      this->c=c;

      Sum+=a+b+c;

      }

      void Myclass::GetSum()

      {

      cout <<"Sum=" <

      }

      int main(void)

      {

      Myclass me(10,20,30);

      me.GetSum();

      system("pause");

      return 0;

      }

      關于靜態成員函數,可以總結為以下幾點:

      1. 出現在類體外的函數定義不能指定關鍵字static;

      2. 靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;

      3. 非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;

      4. 靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;

      5. 由于沒有this指針的額外開銷,因此靜態成員函數與類的全局函數相比速度上會有少許的增長;

      6. 調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜態成員函數,當同一類的所有對象使用一個量時,對于這個共用的量,可以用靜態數據成員變量,這個變量對于同一類的所有的對象都取相同的值。靜態成員變量只能被靜態成員函數調用。靜態成員函數也是由同一類中的所有對象共用。只能調用靜態成員變量和靜態成員函數。

      延伸閱讀:

      http://blog.csdn.net/xiajun07061225/article/details/6860276

      http://blog.csdn.net/xiajun07061225/article/details/6955226

      C++

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

      上一篇:高并發編程-happens-before
      下一篇:Spark Core快速入門系列(12) | 變量與累加器問題
      相關文章
      国产精品亚洲w码日韩中文| 国产精品亚洲专区无码牛牛| 亚洲天堂中文字幕在线| vvvv99日韩精品亚洲| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲av无码乱码在线观看野外| 亚洲精品无码专区在线播放| 亚洲自偷自偷在线成人网站传媒 | 亚洲人成在线精品| 亚洲国产美女视频| 亚洲国产av美女网站| 国产精品亚洲精品| 亚洲欧美成人av在线观看| 亚洲国产成人综合精品| 亚洲七久久之综合七久久| 亚洲第一综合天堂另类专| 亚洲暴爽av人人爽日日碰| 亚洲AV噜噜一区二区三区| 日韩亚洲翔田千里在线| 亚洲av无码成人精品区在线播放| 亚洲人成人无码网www国产| 久久精品亚洲福利| 亚洲成A∨人片在线观看不卡| 久久久久久亚洲精品中文字幕| 亚洲一区二区在线视频| 亚洲春色另类小说| 亚洲国产日韩精品| 在线观看亚洲免费| 精品国产人成亚洲区| 久久久亚洲精品国产| 亚洲视频一区二区在线观看| 精品久久亚洲中文无码| 亚洲另类无码一区二区三区| 丰满亚洲大尺度无码无码专线| 亚洲国产精品尤物YW在线观看| 亚洲欧洲精品无码AV| 亚洲综合精品一二三区在线| 亚洲国产精品成人综合色在线婷婷| 77777亚洲午夜久久多喷| 日韩欧美亚洲国产精品字幕久久久| 亚洲国产91精品无码专区|