C 類中的靜態成員

2021-09-24 15:13:03 字數 2098 閱讀 2090

我們學習乙個知識點,首先想到的是為什麼要有這個東西的存在呢?對於c++ 類的靜態成員存在的理由如下:

有的時候類需要它的一些成員與類本身無關,而不是與類的各個物件保持關聯。

例如:乙個銀行賬戶型別類可能需要乙個資料成員來表示當前基準利率。在此例中,我們希望利率與類關聯,而非與類的每個物件關聯。從實現的效率的角度來看,沒必要每個物件都儲存利率資訊。而且更加重要的是,一旦利率浮動,我們希望所有的物件都能使用新的利率值。

通常在成員的宣告之前加上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 物件而且它被所有 amount 物件共享。

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

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

double r;

r = account :

:rate()

;

雖然靜態成員不屬於類的某個對相關,但是我們仍然可以使用類的物件、引用、指標來訪問靜態成員。成員函式不用通過作用域運算子就能直接使用靜態成員。

和其它的成員函式一樣,我們既可以在類的內部也可以在類的外部定義靜態成員函式。當在類的外部定義靜態成員時,不能重複 static 關鍵字,該關鍵字只能出現在類內部的宣告語句:

void account :

:rate

(double newrate)

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

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

我們定義靜態資料成員方式如下:(我們需要指定物件的型別名,然後是類名,作用域運算子以及成員自己的名字)

double account :

: interestrate =

initrate()

;

通常情況下,類的靜態成員不應該在類的內部初始化。然而,我們可以為靜態成員提供 const 整型型別的類內初始化,不過要求靜態成員必須是字面值常量型別的 constexpr。初始值必須是常量表示式,因為這些成員本身就是常量表示式,所以它們就能用所有適合於常量表示式的地方。

練習面試題:

斐波那契數列:

當使用正常的遞迴解題時,時間複雜度過高,所以我們可以使用靜態成員函式解題:

class solution 

private:

static

intfibonacci

(int n,

int acc1,

int acc2)

};

C 類中的靜態成員

相關規則 1 靜態函式不能呼叫類的成員變數和成員函式 2 成員函式可以呼叫靜態變數和靜態函式 3 靜態變數和靜態函式不屬於類的任何具體物件 沒有this指標 但是可被類的所有物件共享。4 類的靜態變數和靜態函式不能被其派生類繼承 5 靜態變數必須初始化後才能被呼叫 無論是成員函式還是靜態函式呼叫 靜...

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...