C 類中的靜態變數和靜態成員函式

2021-06-16 05:12:40 字數 2882 閱讀 6129

靜態資料成員:

下面看乙個例子:

#include

class point

public:

void output()

static void init()

void main( void )

point pt;

pt.init();

pt.output(); 

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

下面這樣看

#include

class point

public:

void output()

static void init()

void main( void )

point::output();

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

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

好的再看看下面的例子:

#include

class point

public:

void output()

static void init()

void main( void )

point::init();

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

好的再看看下面的例子:

#include

class point

public:

void output()

static void init()

x = 0;

y = 0;

private:

int x;

int y;

void main( void )

point::init();

編譯出錯:

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

public:

void output()

x = 0;

y = 0;

init();  

static void init()

private:

int x;

int y;

void main( void )

point::init();

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

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

好的再看看下面的例子:

#include

class point

public:

void output()

static void init()

x = 0;

y = 0;

private:

static int x;

static int y;

void main( void )

point::init();

編譯: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

public:

void output()

static void init()

x = 0;

y = 0;

private:

static int x;

static int y;

int point::x = 0;

int point::y = 0;

void main( void )

point::init();

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

再看看下面的**:

#include

class point

public:

void output()

static void init()

x = 0;

y = 0;

private:

static int x;

static int y;

void main( void )

編譯沒有錯誤,為什麼?

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

靜態變數和靜態成員函式

c 中的靜態成員變數和靜態成員函式。1 類靜態資料成員在編譯時建立並初始化 在該類的任何物件建立之前就存在,不屬於任何物件,而非靜態類成員變數則是屬於物件所有的。類靜態資料成員只有乙個拷貝,為所有此類的物件所共享。特別需要注意的一點是 靜態資料成員不能在類中初始化 對於常量靜態類變數有待考證,好像可...

c 類的靜態成員(靜態函式和靜態變數)

標誌 都會加上static 靜態成員分為 1.靜態成員變數 1.1 所有的物件共享同乙份資料,都可以對其做出永久性修改 1.2 在編譯階段分配記憶體 1.3 類內宣告,類外初始化 初始化語法 int person a 0 意思就是把person類中的a初始化為零 2.靜態成員函式 2.1所有物件共享...

C 類的靜態變數成員和靜態成員函式的使用

1 類的靜態成員變數 當類的乙個成員變數被宣告為static型別時,該成員變數就是類的靜態變數,屬於類的所有例項。也就是說類的靜態變數是類的所有該類例項的全域性變數。靜態成員變數的初始化,與其他變數的初始化很不一樣,靜態成員需要在類外初始化,形式如下 靜態變數的型別 類名 類的靜態成員變數名 初始化...