1. 程式人生 > 實用技巧 >C++類內靜態成員用法

C++類內靜態成員用法

忘了,mark下 轉至https://www.cnblogs.com/ppgeneve/p/5091794.html

靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如:設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。

  靜態資料成員

  在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有物件中共享的成員,而不是某個物件的成員。

  使用靜態資料成員可以節省記憶體,因為它是所有物件所公有的,因此,對多個物件來說,靜態資料成員只儲存一處,供所有物件共用。靜態資料成員的值對每個物件都是一樣,但它的值是可以更新的。只要對靜態資料成員的值更新一次,保證所有物件存取更新後的相同的值,這樣可以提高時間效率。

  靜態資料成員的使用方法和注意事項如下:

  1、靜態資料成員在定義或說明時前面加關鍵字static。//靜態變數的定義

  2、靜態成員初始化與一般資料成員初始化不同。靜態資料成員初始化的格式如下:

    <資料型別><類名>::<靜態資料成員名>=<值>//靜態變數的初始化

  這表明:

(1)初始化在類體外進行,而前面不加static,(這點需要注意)以免與一般靜態變數或物件相混淆。

  (2) 初始化時不加該成員的訪問許可權控制符private,public等。

  (3) 初始化時使用作用域運算子來標明它所屬類,因此,靜態資料成員是類的成員,而不是物件的成員。

  3、靜態資料成員是靜態儲存的,它是靜態生存期,必須對它進行初始化。

  4、引用靜態資料成員時,採用如下格式:

   <類名>::<靜態成員名> //靜態變數的使用方式

  如果靜態資料成員的訪問許可權允許的話(即public的成員),可在程式中,按上述格式來引用靜態資料成員。

  下面舉一例子,說明靜態資料成員的應用:

StaticTest.h

#include <bits/stdc++.h>
using namespace std;
class StaticTest{
    static int sum;
    int a,b,c;
    public
: StaticTest(int,int,int); void getSum(); void getNumber(); static void f1(StaticTest &); }; StaticTest::StaticTest(int A,int B,int C) { a = A; b = B; c = C; sum += (A + B + C); } void StaticTest::getNumber() { cout << "Number" << endl; } void StaticTest::getSum() { cout << "Sum = " << sum <<endl; } void StaticTest::f1(StaticTest &s) { cout << s.a << endl; cout << sum << endl; } Test.cpp #include "StaticTest.h" int StaticTest::sum = 0;//靜態成員初始化在類體外進行 int main(){ StaticTest M(14,9,11),N(3,7,10); M.getSum(); N.getSum(); StaticTest::f1(N); }

注意,static成員的初始化要在實現中進行,不能在標頭檔案進行。

從輸出結果可以看到Sum的值對M物件和對N物件都是相等的。這是因為在初始化M物件時,將M物件的三個int型資料成員的值求和後賦給了Sum,於是Sum儲存了該值。在初始化N物件時,對將N物件的三個int型資料成員的值求和後又加到Sum已有的值上,於是Sum將儲存另後的值。所以,不論是通過物件M還是通過物件N來引用的值都是一樣的,即為54,s.A=3。

靜態成員函式

  靜態成員函式和靜態資料成員一樣,它們都屬於類的靜態成員,它們都不是物件成員。因此,對靜態成員的引用不需要用物件名。

  在靜態成員函式的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員(這點非常重要)。如果靜態成員函式中要引用非靜態成員時,可通過物件來引用。從中可看出,呼叫靜態成員函式使用如下格式:<類名>::<靜態成員函式名>(<引數表>);