C 類中的靜態成員

2021-05-21 17:37:25 字數 2567 閱讀 1685

相關規則:

1、靜態函式不能呼叫類的成員變數和成員函式;

2、成員函式可以呼叫靜態變數和靜態函式;

3、靜態變數和靜態函式不屬於類的任何具體物件(沒有this指標),但是可被類的所有物件共享。

4、類的靜態變數和靜態函式不能被其派生類繼承;

5、靜態變數必須初始化後才能被呼叫(無論是成員函式還是靜態函式呼叫);

靜態資料成員:

下面看乙個例子:

#include

class point

static void init() };

void main( void )

這樣編譯是不會有任何錯誤的。

下面這樣看

#include

class point

static void init() };

void main( void )

這樣編譯會處錯,錯誤資訊:illegal call of non-static member function,為什麼?

因為在沒有例項化乙個類的具體物件時,類是沒有被分配記憶體空間的。

好的再看看下面的例子:

#include

class point

static void init() };

void main( void )

這時編譯就不會有錯誤,因為在類的定義時,它靜態資料和成員函式就有了它的記憶體區,它不屬於類的任何乙個具體物件。

好的再看看下面的例子:

#include

class point

static void init()

private:

int x;

int y;

};void main( void )

編譯出錯:

illegal reference to data member 'point::x' in a static member function

illegal reference to data member 'point::y' in a static member function

在乙個靜態成員函式裡錯誤的引用了資料成員,

還是那個問題,靜態成員(函式),不屬於任何乙個具體的物件,那麼在類的具體物件宣告之前就已經有了記憶體區,

而現在非靜態資料成員還沒有分配記憶體空間,那麼這裡呼叫就錯誤了,就好像沒有宣告乙個變數卻提前使用它一樣。

也就是說在靜態成員函式中不能引用非靜態的成員變數。

好的再看看下面的例子:

#include

class point

static void init()

private:

int x;

int y;

};void main( void )

好的,這樣就不會有任何錯誤。這最終還是乙個記憶體模型的問題,

任何變數在記憶體中有了自己的空間後,在其他地方才能被呼叫,否則就會出錯。

好的再看看下面的例子:

#include

class point

static void init()

private:

static int x;

static int y;

};void main( void )

編譯:linking...

test.obj : error lnk2001: unresolved external symbol "private: static int point::y" (?y@point@@0ha

)test.obj : error lnk2001: unresolved external symbol "private: static int point::x" (?x@point@@0ha

)debug/test.exe : fatal error lnk1120: 2 unresolved externals

執行 link.exe 時出錯.

可以看到編譯沒有錯誤,連線錯誤,這又是為什麼呢?

這是因為靜態的成員變數要進行初始化,可以這樣:

#include

class point

static void init()

private:

static int x;

static int y;

};int point::x = 0;

int point::y = 0;

void main( void )

在靜態成員資料變數初始化之後就不會出現編譯錯誤了。

再看看下面的**:

#include

class point

static void init()

private:

static int x;

static int y;

};void main( void )

編譯沒有錯誤,為什麼?

即使他們沒有初始化,因為我們沒有訪問x,y,所以編譯不會出錯。

C 類中的靜態成員

我們學習乙個知識點,首先想到的是為什麼要有這個東西的存在呢?對於c 類的靜態成員存在的理由如下 有的時候類需要它的一些成員與類本身無關,而不是與類的各個物件保持關聯。例如 乙個銀行賬戶型別類可能需要乙個資料成員來表示當前基準利率。在此例中,我們希望利率與類關聯,而非與類的每個物件關聯。從實現的效率的...

C 類中的靜態成員

1 靜態類成員變數 ifndef cl student h define cl student h include class cl student endif include qstring cl student sta school uestc 初始化靜態類成員變數 cl student cl ...

c 類中的靜態成員

靜態成員和非靜態成員的區別 class type class student 類的靜態成員包括 1 靜態資料成員 類的靜態資料成員儲存在全域性 靜態 儲存區,靜態資料成員定義時要分配儲存空間,而類定義本身不占用記憶體空間,只有在例項化為物件時才分配記憶體空間,因此靜態資料成員不能再類中進行定義,st...