C 理解(5) C 中類的靜態成員函式

2021-10-20 18:13:52 字數 2518 閱讀 2463

問題:隨時可以獲取當前物件的數目。

#include

class

test

~test()

intgetcount()

};int test::ccount =0;

test gtest;

intmain()

這個辦法獲取物件總是通過getcount()這個函式來呼叫的。但是暴露了乙個問題,物件數目不能為0,也就是說當物件數目為0系統就會出現問題。有沒有乙個辦法改善呢?我們先設定物件數目為0個,將私有的改為共有的(private->public)

#include

class

test

~test()

intgetcount()

};int test::ccount =0;

intmain()

這樣的public方法使得ccount便於類的呼叫的了,輸出結果當然為ccount=0;但是這個是一種賦值的方法,假如使得int test::ccount = 10;結果count = 10;事實上,對於列為public方法來說,這是個對資料安全不大可靠的問題,因此類似於成員函式的處理,我們也要使用static的關鍵字來實現成員函式。

#include

class

demo

;int demo::

geti()

void demo::

staticfunc

(const

char

* s)

void demo::

staticseti

(demo& d,

int v)

intmain()

結果:

staticfunc: main begin...

d.i =

20d.i =

10staticfunc: main end.

..

上面的**關鍵字修飾了兩個靜態成員函式:

static

void

staticfunc

(const

char

* s)

;static

void

staticseti

(demo& d,

int v)

;

類呼叫的靜態成員函式

demo::

staticfunc

("main begin..."

);

物件呼叫的靜態成員函式

d.

staticseti

(d,20

);

上面大致看出,

靜態成員函式是類的特殊成員函式

靜態成員函式是整個類所有的

可以通過類名直接訪問公有的靜態成員函式

物件也可以訪問公有的靜態成員函式

**中;private: int i;是私有的變數。靜態成員函式:demo::staticseti(demo& d, int v)

是在通過物件呼叫私有的成員函式d.i = v;

上面列出靜態成員函式與成員函式的區別。

直接上靜態成員函式統計物件的**;

#include

class

test

~test()

static

intgetcount()

};int test::ccount =0;

intmain()

結果:

count = 0

count = 2

count = 2

count = 3

count = 2

靜態變數是多個物件共享的。因此建立物件的t1,t2之後ccount=2delete pt;之後便是釋放整個變數。

總結:

靜態成員函式是類中的特殊的成員函式

靜態成員函式沒有隱藏的this指標

靜態成員函式可以通過類名直接訪問

靜態成員函式可以通過物件訪問

靜態成員函式只能直接訪問靜態成員變數(函式),而不能直接訪問普通成員變數(函式)

C 類靜態成員與類靜態成員函式

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...

C 類靜態成員與類靜態成員函式

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...

C 類靜態成員與類靜態成員函式

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...