二級C++類與對象:靜態(tài)成員和友員

字號:

創(chuàng)建靜態(tài)成員主要是解決數(shù)據(jù)共享問題,而創(chuàng)建友員的目的是為了讓某些函數(shù)訪問類中的私有成員。
    靜態(tài)對象獨立于具體的類對象而存在,是從屬于類的屬性,不是屬于某個對象的。靜態(tài)成員變量一般用于:
    ⒈用來保存該類對象的個數(shù)。
    ⒉作為一個標志,指示一個特定的動作是否發(fā)生,如:可能創(chuàng)建幾個對象,每個對象要對某個磁盤文件進行寫操作,但顯然在同一時間里只允許一個對象寫文件,在這種情況下,用戶希望說明一個靜態(tài)數(shù)據(jù)成員指出文件何時正在使用,何時處于空閑狀態(tài)。
    ⒊用來保存指向鏈表第一成員或最后一個成員的指針。
    ⒋用來管理該類的各個對象共享的一些資源,如各個對象都從同一空間分配,或者各個對象使用同一文件資源等。
    ⒌靜態(tài)成員函數(shù)則用來對這些靜態(tài)成員數(shù)據(jù)操作。如返回對象個數(shù),查找鏈表中的某個節(jié)點,或者判斷某個共享文件是否被某個對象使用等。
    靜態(tài)成員函數(shù)與一般成員函數(shù)的區(qū)別:
    (1)定義方式不同:靜態(tài)成員定義時前面加修飾符 static. 而非靜態(tài)成員不用。
    (2)使用限制不同:靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量。而非靜態(tài)成員函數(shù)既可以訪問靜態(tài)數(shù)據(jù)成員也可以訪問非靜態(tài)數(shù)據(jù)成員。
    (3)調(diào)用方式不同:靜態(tài)成員函數(shù)的調(diào)用格式為: classname::static Func(), 而非靜態(tài)成員函數(shù)的調(diào)用須通過具體的對象調(diào)用,格式為: Object.func() 。
    (4)靜態(tài)成員函數(shù)沒有 this 指針,所以它不能訪問訪問某個具體對象的數(shù)據(jù)成員,即靜態(tài)成員函數(shù)不能訪問非靜態(tài)數(shù)據(jù)成員。
    1、靜態(tài)數(shù)據(jù)成員:
    (1)靜態(tài)數(shù)據(jù)成員在定義或說明時前面加關鍵字 static 。
    例: …….
    Private:
    Int a,b,c;
    Static int s;
    (2)靜態(tài)成員的初始化與以便數(shù)據(jù)成員的初始化不同。 靜態(tài)數(shù)據(jù)成員一般在類定義外部按特定的格式進行初始化。其格式為:
    < 數(shù)據(jù)類型 >< 類名 >::< 靜態(tài)數(shù)據(jù)成員名 >=< 值 >;
    例: class Nclass
    {
    ……..
    private:
    static int a;
    …….
    };
    int Nclass::a=5;
    (3)引用靜態(tài)數(shù)據(jù)成員時,采用如下格式:
    < 類名 >::< 靜態(tài)成員名 >
    如果靜態(tài)數(shù)據(jù)成員的訪問權限允許的話(即 public 成員),可在程序中,按上述格式來引用靜態(tài)數(shù)據(jù)成員。
    例 1 :
    #include
    class Myclass
    {
    public:
    Myclass(int a,int b,int c);
    Void GetNumber();
    Void GetSum();
    Private:
    Int A,B,C;
    Static int Sum;
    };
    int Myclass::Sum=0;
    Myclass::Myclass(int a,int b,int c)
    {
    A=a;
    B=b;
    C=c;
    Sum+=A+B+C;
    }
    void Myclass::GetNumber()
    {
    cout<<”Number=”<
    }
    void Myclass::GetSum()
    {
    cout<<”Sum=”<    }
    void main()
    {
    Myclass M(1,2,3),N(4,5,6);
    M.GetNumber();
    N.GetNumber();
    M.GetSum();
    N.GetSum();
    }
    運行結果:
    Number=1,2,3
    Number=4,5,6
    Sum=21
    Sum=21
    這里, M 和 N 兩個對象的 Sum 值相等。