類(六) 類的靜態成員

2021-10-07 12:15:43 字數 2479 閱讀 2908

《基於 c++ primer p268>

我們需要類的一些成員與類本身直接相關,而不是與類的各個物件保持關聯。

(1)宣告靜態成員

我們通過在成員的宣告之前加上關鍵字 static 使得其與類關聯在一起。

靜態成員既可以是 public 也可以是 private。

靜態資料成員的型別可以是常量、引用、指標、類型別等。

class

account

static

double

rate()

static

void

rate

(double);

private

: std::string owner;

double amount;

static

double interestrate;

static

double

initrate()

;}

類的靜態成員存在與任何物件之外,物件中不包含任何與靜態資料成員有關的資料。因此,每個 account 物件只包含兩個資料成員:owner 和 amount。只存在乙個 interestrate 物件而且它被所有 account 物件共享。

類似的,靜態成員函式也不與任何物件繫結在一起,它們不包含 this 指標。因此,靜態成員函式不能被宣告成 const 的,而且也不能在函式體內使用 this 指標。

(2)使用類的靜態成員

我們使用作用運算子直接訪問靜態成員。

double r

r = account::

rate()

;

雖然靜態成員不屬於類的某個物件,但是我們仍然可以使用類的物件、引用或指標訪問靜態成員。

account ac1;

account *ac2 =

&ac1;

r = ac1.

rate()

;r = ac2-

>

rate()

;

成員函式不用通過作用域運算子就可以直接使用靜態成員。

class

account

private

:static

double interestrate;

};

(3)定義靜態成員

我們既可以在類的內部也可以在類的外部定義靜態成員函式。但 static 關鍵字只能出現在類內部的宣告語句中。

void account::

rate

(double newrate)

因為靜態資料成員不屬於類的任何乙個物件,所以它們並不是在建立類的物件時被定義的。這意味著它們不是由類的建構函式初始化的,而且一般來說,我們不能在類的內部初始化靜態成員。

我們必須在類的外部定義和初始化每個靜態成員,乙個靜態成員只能被定義一次,因此我們最好將靜態資料成員的定義與其他非內聯函式的定義放在同乙個檔案中。

類似於全域性變數,靜態資料成員定義在任何函式之外。因此一旦被定義,就將一直存在於程式的整個生命週期中。

定義靜態資料成員的方式和在類的外部定義成員函式差不多。指定物件的型別名,然後是類名、作用域運算子以及成員自己的名字。

double account::interestrate =

initrate()

;

(4)靜態成員的類內初始化

通常情況下,類的靜態成員不應該在類的內部初始化。

但是,我們也可以為靜態成員提供 const 整數型別的類內初始值,要求靜態成員必須是字面值常量型別的constexpr,初始值必須是常量表示式。

class

account

static

void

rate

(double);

private

:static

constexpr

int period =30;

// period 是常量表示式

double daily_tbl[period]

;}

即使乙個常量靜態資料成員在類內部被初始化了,通常情況下也應該在類的外部定義以下該成員。此時不能再指定乙個初始值了。

(5)靜態成員能用於某些場景,而普通成員不能

①靜態資料成員可以是不完全型別。

特別的,靜態資料成員的型別可以就是它所屬的類型別。

而非靜態成員則收到限制,只能宣告成它所屬類的指標或引用。

class

bar;

②我們可以使用靜態成員作為預設實參。

class

screen

;

非靜態資料成員不能作為預設實參,因為它的值本身屬於物件的一部分,這麼做的結果是無法真正提供乙個物件以便從中獲取成員的值,最終將引發錯誤。

超六類網線和六類網線的區別 Vecloud

自2009年tia 568c.2標準發布以後,超六類線纜開始被廣泛地應用在各個佈線系統中。與傳統的六類線纜相比,超六類線擁有更高的傳輸頻率和速率。一般情況下,六類線纜的頻寬為250mhz,而超六類線纜的頻寬是其的兩倍,這對於對網路頻寬要求很高的資料中心來說,超六類線纜顯然是乙個非常不錯的解決方案。作...

Kotlin筆記(六)類

class 類名 類頭 指定其型別引數 主 建構函式等 class person constructor firstname string 沒有類頭 class person 沒有類頭類體 class person 建構函式 class person constructor firstname st...

實驗六 類的繼承

一 實驗目的 了解繼承的作用,掌握三種不同的繼承方法,掌握派生類的設計方法。二 實驗內容 1 定義乙個rectangle類,它包含兩個資料成員length和width,以及用於求長方形面積的成員函式。再定義rectangle的派生類rectangular,它包含乙個新資料成員height和用來求長方...