類的靜態成員函式和靜態資料成員

2021-07-05 11:46:29 字數 3813 閱讀 6668

一、基本知識

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

靜態資料成員的用途之一是統計有多少個物件實際存在。

靜態資料成員不能在類中初始化,實際上類定義只是在描述物件的藍圖,在其中指定初值是不允許的。也不能在類的建構函式中初始化該成員,因為靜態資料成員為類的各個物件共享,否則每次建立乙個類的物件則靜態資料成員都要被重新初始化。

靜態成員不可在類體內進行賦值,因為它是被所有該類的物件所共享的。你在乙個物件裡給它賦值,其他物件裡的該成員也會發生變化。為了避免混亂,所以不可在類體內進行賦值。

靜態成員的值對所有的物件是一樣的。靜態成員可以被初始化,但只能在類體外進行初始化。

一般形式:

資料型別  類名::靜態資料成員名=初值
注意:不能用引數初始化表對靜態成員初始化。一般系統預設初始為0。

靜態成員是類所有的物件的共享的成員,而不是某個物件的成員。它在物件中不占用儲存空間,這個屬性為整個類所共有,不屬於任何乙個具體物件。所以靜態成員不能在類的內部初始化,比如宣告乙個學生類,其中乙個成員為學生總數,則這個變數就應當宣告為靜態變數,應該根據實際需求來設定成員變數。

#include 

using

namespace

std;

class test

};int test::num = 10;//在類體外對靜態資料成員初始化

int main()

通過上例可知:

x+=5;   // 這行**是錯誤的

靜態函式成員必須通過物件名來訪問非靜態資料成員。

另外,靜態成員函式在類外實現時候無須加static關鍵字,否則是錯誤的。

若在類的體外來實現上述的那個靜態成員函式,不能加static關鍵字,這樣寫就可以了:

int test::getnum()

1、static成員的所有者是類本身和物件,但是多有物件擁有一樣的靜態成員。從而在定義物件是不能通過建構函式對其進行初始化。

2、靜態成員不能在類定義裡邊初始化,只能在class body外初始化。

3、靜態成員仍然遵循public,private,protected訪問準則。

4、靜態成員函式沒有this指標,它不能返回非靜態成員,因為除了物件會呼叫它外,類本身也可以呼叫。

5、靜態成員函式可以直接訪問該類的靜態資料和函式成員,而訪問非靜態資料成員必須通過引數傳遞的方式得到乙個物件名,然後通過物件名來訪問。

6、設定了靜態成員變數,必須要為其賦初值。

二、靜態成員函式訪問非靜態成員

類的靜態成員(變數和方法)屬於類本身,在類載入的時候就會分配記憶體,可以通過類名直接去訪問;非靜態成員(變數和方法)屬於類的物件,所以只有在類的物件產生(建立類的例項)時才會分配記憶體,然後通過類的物件(例項)去訪問。

在乙個類的靜態成員中去訪問其非靜態成員之所以會出錯,是因為在類的非靜態成員不存在的時候類的靜態成員就已經存在了,訪問乙個記憶體中不存在的東西當然會出錯。

c++會區分兩種型別的成員函式:靜態成員函式和非靜態成員函式。這兩者之間的乙個重大區別是,靜態成員函式不接受隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。

例1:

#include 

using

namespace

std;

class test

void func()

結果:

func()被靜態成員函式呼叫

222process returned 0 (0x0) execution time : 0.212 s

press any key to continue.

例2:

#include 

using

namespace

std;

class m

~m(){}

static

void f1();

private:

int a;

static

int b;

};void m::f1()

結果:

a=5

b=10

process returned 0 (0x0) execution time : 0.273 s

press any key to continue.

三、訪問私有靜態成員資料

如果把靜態成員資料設為私有,可以通過公有靜態成員函式!!!!!訪問。

#include 

using

namespace

std;

class cat

virtual ~cat()

virtual

int getage()

virtual

void setage(int age);

static

int gethowmany()

private:

int itsage;

static

int howmanycats;

};int cat::howmanycats=0; //對靜態成員資料如此賦值

int main()

return

0;}

結果:

there are 5 cats left!

delete the cat which is

0 years old.

there are

4 cats left!

delete the cat which is

1 years old.

there are

3 cats left!

delete the cat which is

2 years old.

there are

2 cats left!

delete the cat which is

3 years old.

there are

1 cats left!

delete the cat which is

4 years old.

process returned 0 (0x0) execution time : 0.409 s

press any

keyto

continue.

類的靜態成員函式和靜態資料成員

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

類的靜態資料成員和靜態成員函式

一.什麼是類的靜態成員 靜態成員變數和全域性變數都儲存在全域性 靜態區,它們都是在程式編譯時建立,直到編譯結束才被收回.所以全域性變數和靜態成員變數的功能差不多,只是建立的方式不同,類的靜態成員建立在類中,全域性變數建立在程式開頭.二.為什麼要用類的靜態成員而不用全域性變數 全域性變數在c中得心應手...

靜態資料成員和靜態成員函式

靜態資料成員屬於類 準確地說,是屬於類中乙個物件集合 而不像普通資料成員那樣屬於某一物件,因此可以使用 類名 訪問靜態的資料成員。例如上面例子中的 student count。靜態資料成員不能在類中進行初始化,因為在類中不給它分配記憶體空間,必須在 類外的其它地方為它提供定義。一般在 main 開始...