類與物件 static成員

2021-08-30 15:58:36 字數 2875 閱讀 7354

思考:在類中新增乙個普通的成員變數進行計數

class date

date(const date&d)

~date()

private:

int _year;

int _month;

int _day;

int _count; };

void testdate()

int main()

除錯結果

發現每乙個物件的count值都是1,也就是說每乙個物件的count之間沒有聯絡,所以設定的變數不應該與物件之間有關聯,應該設定乙個變數是共享的,所以想到我們可以設定乙個全域性變數

int _count = 0;

class date

date(const date&d)

~date()

private:

int _year;

int _month;

int _day;

};

程式執行成功,可以求類建立了多少物件。可是此時有乙個問題?這個程式不安全,因為任何人都可以修改這個count

思考:  static所修飾的類成員,類的靜態成員:靜態成員變數+靜態成員函式考慮定義成 public ,不安全,類的成員一般是  private 。如果宣告 private ,在類外直接呼叫會產生鏈結錯誤 。然後我們可以試一下將宣告放到類裡,將初始化放到類外。

class date

date(const date&d)

~date()

private:

int _year;

int _month;

int _day;

static int _count; };

int date::_count = 0;

void testdate()

int main()

測試結果

靜態成員與普通成員之間的區別:靜態成員變數不屬於物件本身的內容,但可以通過打點 .  或者 sizeof 呼叫。注:以 . 的方式一般是物件呼叫方法的方式為什麼可以這樣用呢?答案是因為它是類的特性

但是要注意的一點是sizeof()的結果是不包括靜態變數。

上面這兩種呼叫方式,第乙個通過物件呼叫靜態變數,其在底層的實現方式其實就是方式二,因為_count 是靜態成員,具有類的特性,所以方式二是直接取 _count 所在位置的內容。靜態成員既然是類的成員變數,就要受到訪問限定修飾符的限制給成  private 這就與全域性變數區分開了。但在類外就不能訪問,可以寫乙個函式 getcount()進行訪問,此時getcount()是普通成員函式,必須通過物件呼叫。

比較下面這兩種寫法:

發現第二種寫法,報錯了,分析之後發現必須是在建立物件之後才能呼叫。但是客觀來講,它應該在開始也可以呼叫,此時建立物件數為零個。所以我們給 getcount()  函式前加個static 變成靜態成員函式。模擬靜態成員變數的特性,靜態成員函式也是類的特性,可通過類來呼叫,不受物件的限制

靜態成員函式和普通成員函式的區別:1. 靜態成員函式沒有this指標

因此在類的靜態成員函式中不能訪問類的非靜態成員變數。

反之,則可以,因為不管靜態成員函式多麼特殊,它始終是類的屬性,自然可以在類的其他函式中呼叫。

2.不能用const修飾,原因也是因為沒有this 指標。

3.呼叫方式不一樣(見下圖)

兩個函式在底層的實現方式不同,呼叫約定不同。普通成員函式,是要用this指標呼叫,所以呼叫約定是——thiscall

而靜態成員函式是一般的呼叫約定_cdecl。

類模板與static成員

1.從類模板例項化的每個模板類都有自己的類模板資料成員,該模板類的所有物件共享乙個static資料成員 2.和非模板類的static資料成員一樣,模板類的static資料成員也應該在檔案範圍定義和初始化 3.每個模板類有自己的類模板的static資料成員副本 includeconst double ...

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

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

類的static成員

類static成員的兩個問題 如果需要在乙個類的各個物件間互動,即需要乙個資料物件為整個類而非某個物件服務,這個時候常用類成員來解決問題。1 靜態資料成員要在類外定義。class teststatic static int teststaticfunction teststatic obj priv...