C 類中靜態變數和靜態方法使用介紹!

2022-03-27 11:22:01 字數 1765 閱讀 5846

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

靜態資料成員

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

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

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

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

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

《資料型別》《類名》::《靜態資料成員名》=《值》

//靜態變數的初始化

這表明:

(1)初始化在類體外進行,而前面不加static

,(這點需要注意)以免與一般靜態變數或物件相混淆。

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

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

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

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

《類名》::《靜態成員名

>   //靜態變數的使用方式

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

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

#include

class myclass

;int myclass::sum = 0;   //初始化

myclass::myclass(int a, int b, int c)   //構造方法

void myclass::getnumber()

void myclass::getsum()

void main()

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

靜態成員函式

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

在靜態成員函式的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員(這點非常重要)

。如果靜態成員函式中要引用非靜態成員時,可通過物件來引用。下面通過例子來說明這一點。

#include

class m

static void f1(m m);  //靜態成員函式

private:

int a;

static int b;     //靜態成員屬性

};void m::f1(m m)

int m::b=0;

void main()

讀者可以自行分析其結果。從中可看出,呼叫靜態成員函式使用如下格式:

《類名》::《靜態成員函式名》(《參數列》);

C 類中靜態變數和靜態方法使用介紹

靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如 設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。靜態資料成員 在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了...

C 類中靜態變數和靜態方法使用介紹

刷劍指offer第64題涉及到類內靜態成員與方法的知識,有點模糊,找了兩篇部落格整理一下。最近一直看c 相關的專案,但總是會被c 類中的靜態成員變數與靜態成員函式的理解感覺很是模糊,不明白為什麼類中要是用靜態成員變數.於是在網上蒐集了一些資料,自己再稍微總結下。靜態成員的概念 靜態類中的成員加入st...

C 類中靜態變數和靜態方法的使用

靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如 設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。靜態資料成員 在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了...