C++ 靜態成員的類內初始化詳解及實例代碼。本站提示廣大學習愛好者:(C++ 靜態成員的類內初始化詳解及實例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 靜態成員的類內初始化詳解及實例代碼正文
C++ 靜態成員的類內初始化詳解及實例代碼
一般來說,關於C++類靜態成員的初始化,並不會讓人感到難以理解,但是提到C++ 靜態成員的"類內初始化"那就容易迷糊了。
我們來看如下代碼:
//example.h #include<iostream> #include<vector> using namespace std; class Example{ public: static double rate = 6.5; static const int vecSize = 20; static vector<double> vec(vecSize); }; //example.cpp #include "example.h" double Example::rate; vector<double> Example::vec;
我們需要判斷上面的靜態數據成員的聲明和定義有沒有錯誤,並解釋原因。
首先,要謹記:通常情況下,不應該在類內部初始化成員,無論是否為靜態成員。
其次,若一定要在類內初始化靜態成員,那麼就必須滿足如下條件才行:
1) 靜態成員必須為字面值常量類型的constexpr。
所謂的字面值類型就是通常遇到的:算術類型,引用,指針等。字面值常量類型就是const型的算術類型,引用,指針等。
所謂的constexpr,就是常量表達式,指值不會改變且在編譯過程中就能得到計算結果的表達式。比如字面值,或者用常量表達式初始化的const對象也是常量表達式。為了幫助用戶檢查自己聲明/定義的變量的值是否為一個常量表達式,C++11新規定,允許將變量聲明為constexpr類型,以便由編譯器來進行驗證變量是否為常量表達式。
2)給靜態成員提供的初始值,必須為常量表達式
注意:在C++ primer 第五版中說:只能給靜態成員提供const 整數類型的類內初始值,且該const整數類型的初始值必須是常量表達式。我覺得是有誤的!詳情見後面分析。
有了這兩條原則,我們就可以對上面的代碼進行驗證了。
1)static double rate = 6.5;
顯然不滿足第一條:因為rate不是常量類型。改成constexprt static const double rate = 6.5即可
從這裡也可以看出初始值不一定必須為const 整數類型。
ps: 如果我們不再這裡加入constexprt修飾符的話,編譯器會提示錯誤:error: ‘constexpr' needed for in-class initialization of static data member ‘const double Example::rate' of non-integral type [-fpermissive]
大體意思就是,對於非const整數類型的初始值,如果它是常量表達式的話,我們需要手工在前面添加修飾符constexprt。
至於Example.cpp文件中的定義部分,由於我們已經在類內部進行了初始化,就不需要再在類外部進行定義了。如果非要定義的話,必須采用如下格式:
//example.cpp constexpr const double Example::rate; //其中的const是可以刪除的,因為constexprt本身就包含了const
2)static const int vecSize = 20;
vecSize是const int類型的,且為常量表達式——滿足第一條;提供的初始值為20,是一個常量表達式——滿足第二條!且由於是const int型的,前面可以不用修飾符constexpr。
3)static vector<double> vec(vecSize);
錯誤!vector是模板不是字面值常量類型,所以不滿足第一條。應該改為 static vector<double> vec; //僅僅且只能進行聲明,不能定義
然後在Example.cpp中進行定義:
static vector<double> vec(Example::vecSize);
現在我們可以在Example.cpp中添加測試代碼進行測試了:
#include "example.h" vector<double> Example::vec(Example::vecSize); constexpr const double Example::rate; int main(){ Example::vec.push_back(10.5); cout << Example::vec.back() << endl; cout << Example::rate << endl; cout << Example::vecSize << endl; }
執行結果:
wanchouchou@wanchouchou-virtual-machine:~/c++/7.5$ ./Example 10.5 6.5 20
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
[db:作者簡介][db:原文翻譯及解析]