程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++類靜態成員與類靜態成員函數詳解

C++類靜態成員與類靜態成員函數詳解

編輯:關於C++

C++類靜態成員與類靜態成員函數詳解。本站提示廣大學習愛好者:(C++類靜態成員與類靜態成員函數詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++類靜態成員與類靜態成員函數詳解正文


當將類的某個數據成員聲明為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<<endl;        //10
     test::num = 20;
     cout<<test::num<<endl;        //20
     cout<<test::Getnum()<<endl;   //35
     cout<<a.Getnum()<<endl;       //50
     system("pause");
     return 0;
}

經由過程上例可知:  x+=5;   // 這行代碼是毛病的
靜態函數成員必需經由過程對象名來拜訪非靜態數據成員。
別的,靜態成員函數在類外完成時刻不必加static症結字,不然是毛病的。
若在類的體外來完成上述的誰人靜態成員函數,不克不及加static症結字,如許寫便可以了:

     int test::Getnum()
     {
       .........
     }

1、static成員的一切者是類自己和對象,然則多有對象具有一樣的靜態成員。從而在界說對象是不克不及經由過程結構函數對其停止初始化。

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();
};
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=" <<Sum <<endl;
}
int main(void)
{
        Myclass me(10,20,30);
        me.GetSum();
        system("pause");
        return 0;
}

由上例可知,非靜態成員函數可以隨意率性地拜訪靜態成員函數和靜態數據成員。
非靜態成員函數Myclass(int a,int b,int c)和GetSum()都拜訪了靜態數據成員Sum。
靜態成員函數不克不及拜訪非靜態成員函數和非靜態數據成員。

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

湧現在類體外的函數界說不克不及指定症結字static;

靜態成員之間可以互相拜訪,包含靜態成員函數拜訪靜態數據成員和拜訪靜態成員函數;

非靜態成員函數可以隨意率性地拜訪靜態成員函數和靜態數據成員;

靜態成員函數不克不及拜訪非靜態成員函數和非靜態數據成員;

因為沒有this指針的額定開支,是以靜態成員函數與類的全局函數比擬速度上會有少量的增加;

挪用靜態成員函數,可以用成員拜訪操作符(.)和(->)為一個類的對象或指向類對象的指針挪用靜態成員函數,當統一類的一切對象應用一個量時,關於這個共用的量,可以用靜態數據成員變量,這個變量關於統一類的一切的對象都取雷同的值。靜態成員變量只能被靜態成員函數挪用。靜態成員函數也是由統一類中的一切對象共用。只能挪用靜態成員變量和靜態成員函數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved