易忘知識點——C++類的static數據成員

就要去實習了,迅速過第二遍《C++ Primer》,看到遺忘了的知識點就記在這了。

 

1.類的static數據成員的初始化不同於普通成員:static成員不是通過構造函數初始化的,而是在定義時進行初始化。即,除了在聲明類時聲明一次static數據成員,還需要在第一次使用前定義一次。書中舉例:

類Account定義的片段:

class Account {

……

private:

    static double interestRate;

    static double initRate();

……

}

在外部使用interestRate之前,需要進行如下定義:

// define and initialize static class member

double Account::interestRate = initRate();


2.值得注意的是:

我們在外部定義時調用了initRate(),這是一個Account類的private函數。對此書中這樣解釋:就像其他成員定義一樣,一旦成員名出現,static成員的定義就在該類作用域中。因此我們可以使用Account的private函數。

 

我的理解是:請注意這是定義,不是賦值。想想你在全局作用域定義類的函數時的情形,類比一下,你就知道:

double Account::initRate() {

// 這裏不是也可以直接調用Account的private函數嗎

……

}

3.另外,書中建議:爲了保證對象定義正好一次,應該將static數據成員的定義放在包含類的非內聯成員函數定義的文件中。說簡單點就是放在.cpp中,不要放在.h中,因爲.h可能會被多個文件包含,產生重複定義。

 

4.只有在類定義體內部的聲明中才能使用static關鍵字,定義時不能使用。在定義時如下的寫法是錯的:

static double Account::interestRate = initRate();

 

5.特殊的整型const static成員:
一般而言,類的static成員想普通數據成員一樣,是不能在類的定義體中初始化的(即不能像Java那樣)。但是有個例外,就是整形的const static成員。請看實例說明:

class Account {

……

private:

    static double interestRate1 = initRate();    // 錯誤

    double interestRate2 = 0.02;                 // 錯誤

    static cons tint period = 30;                // 正確,但是仍要在類的定義體之外進行定義

……

} 

在使用period之前,我們仍需要在類的定義體之外定義,但是此時已經不需要指定初始化值了:

const int Account:: period;
發佈了35 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章