C 基礎系列八 static類成員

2022-09-14 06:51:09 字數 1689 閱讀 8639

以下內容主要來自於c++ primer中文版第四版12.6節。

對於乙個已經定義的類,有的時候需要定義這個類的乙個全域性物件來獲取或管理全體類物件的相關資訊,比如統計所有類物件的數量。但是全域性物件會帶來問題:全域性物件可被使用者隨意修改,破壞了封裝性。因而常常用類靜態成員來代替全域性物件。

通常,非static資料成員存在於類型別的每個物件中,而static資料成員獨立於該類的任意物件而獨立存在;每個static資料成員是與類關聯的物件,而不與類物件關聯。

類也可以定義static成員函式,static成員函式沒有this形參,它可以直接訪問類的static成員,但不能直接訪問非static成員。

(1)使用static成員的優點

較全域性物件,使用static成員有以下幾個優點:

a. static成員位於類的作用域中,因而可以避免與其他類的成員或全域性物件名字衝突;

b. 可以實施封裝 static成員可以是私有成員,而全域性物件不可以;

c. static成員通過類操作,從而提高程式的可讀性。

(2)static函式沒有this指標

static成員是類的組成部分,但不是任何物件的組成部分,因此static成員函式沒有this指標,通過static成員顯式或隱式引用this指標會造成編譯錯誤。

static成員函式不能為const:將成員函式宣告為const就是保證不會修改該函式所屬的物件,而static成員函式並不關聯物件。static也不能宣告為虛函式。

(3)static資料成員的定義

static 資料成員必須在類定義體外定義,它不能像普通資料成員一樣通過建構函式進行初始化,而是在定義時初始化,如下: 

1

class

account2;

//類體外定義

double account::interestrate = initrate();

上面的**中,在類體外呼叫類的私有成員函式initrate()對static資料成員interestrate進行定義,由於interestrate的作用域位於類中,所以可以訪問類的私有成員,所以上面呼叫initrate()進行定義是合法的。

注意:體外定義時不要加上static關鍵字。

雖然一般的非const的static資料成員被要求在類體外定義,但是const static成員則可以在類體中進行初始化,即使如此,還是需要在類的定義體外對該static資料進行定義(vs2010中是不需要的),但是不能再指定初始值,否則編譯器會報重定義,多次初始化錯誤:

1

class

account2;

67//類體外進行定義

8const

int account::period;

(4)static成員獨立類物件而存在

普通成員是給定類的每個物件的組成部分,而static成員不屬於任何物件,所以static資料成員型別可以是該成員所屬的類型別,而非static成員則被限定只能為其自身類物件的指標或引用:

class

bar;

static成員可以用作預設實參,非static成員則由於無法提供物件以獲取該成員的值而不能作預設實參:

1

class

account

2;

C 之static類成員,static類成員函式

0.static修飾類中成員,表示類的共享資料 1.static類成員 在c primer裡面說過,static類成員不像普通的類資料成員,static類資料成員獨立於一切類物件處在。static類資料成員是與類關聯的,但不與該類定義的物件有任何關係。這句話什麼意思?就是static不會想普通類資料...

C 類的static成員

1,靜態 static 成員綜述 靜態成員 不是任意物件的組成部分,但由給定類的全體物件所共享的資料成員或函式成員。靜態成員是與類關聯的物件,而不是像普通的成員那樣與類的物件相關聯。靜態成員可以是資料成員,或成員函式。靜態成員遵循正常的共有 私有訪問規則。通過關鍵字static宣告靜態成員。2,靜態...

C 類static 成員的使用

靜態成員屬於類,但不屬於物件所有。例如類a中含有乙個靜態成員static a,那麼所有的a的物件都可以共享a 靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如 設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。類...