C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼
C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼
一般來說,關(guān)于C++類靜態(tài)成員的初始化,并不會(huì)讓人感到難以理解,但是提到C++ 靜態(tài)成員的"類內(nèi)初始化"那就容易迷糊了。
我們來看如下代碼:
//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;
我們需要判斷上面的靜態(tài)數(shù)據(jù)成員的聲明和定義有沒有錯(cuò)誤,并解釋原因。
首先,要謹(jǐn)記:通常情況下,不應(yīng)該在類內(nèi)部初始化成員,無論是否為靜態(tài)成員。
其次,若一定要在類內(nèi)初始化靜態(tài)成員,那么就必須滿足如下條件才行:
1) 靜態(tài)成員必須為字面值常量類型的constexpr。
所謂的字面值類型就是通常遇到的:算術(shù)類型,引用,指針等。字面值常量類型就是const型的算術(shù)類型,引用,指針等。
所謂的constexpr,就是常量表達(dá)式,指值不會(huì)改變且在編譯過程中就能得到計(jì)算結(jié)果的表達(dá)式。比如字面值,或者用常量表達(dá)式初始化的const對(duì)象也是常量表達(dá)式。為了幫助用戶檢查自己聲明/定義的變量的值是否為一個(gè)常量表達(dá)式,C++11新規(guī)定,允許將變量聲明為constexpr類型,以便由編譯器來進(jìn)行驗(yàn)證變量是否為常量表達(dá)式。
2)給靜態(tài)成員提供的初始值,必須為常量表達(dá)式
注意:在C++ primer 第五版中說:只能給靜態(tài)成員提供const 整數(shù)類型的類內(nèi)初始值,且該const整數(shù)類型的初始值必須是常量表達(dá)式。我覺得是有誤的!詳情見后面分析。
有了這兩條原則,我們就可以對(duì)上面的代碼進(jìn)行驗(yàn)證了。
1)static double rate = 6.5;
顯然不滿足第一條:因?yàn)閞ate不是常量類型。改成constexprt static const double rate = 6.5即可
從這里也可以看出初始值不一定必須為const 整數(shù)類型。
ps: 如果我們不再這里加入constexprt修飾符的話,編譯器會(huì)提示錯(cuò)誤:error: ‘constexpr' needed for in-class initialization of static data member ‘const double Example::rate' of non-integral type [-fpermissive] 
大體意思就是,對(duì)于非const整數(shù)類型的初始值,如果它是常量表達(dá)式的話,我們需要手工在前面添加修飾符constexprt。
至于Example.cpp文件中的定義部分,由于我們已經(jīng)在類內(nèi)部進(jìn)行了初始化,就不需要再在類外部進(jìn)行定義了。如果非要定義的話,必須采用如下格式:
//example.cpp constexpr const double Example::rate; //其中的const是可以刪除的,因?yàn)閏onstexprt本身就包含了const
2)static const int vecSize = 20;
vecSize是const int類型的,且為常量表達(dá)式——滿足第一條;提供的初始值為20,是一個(gè)常量表達(dá)式——滿足第二條!且由于是const int型的,前面可以不用修飾符constexpr。
3)static vector<double> vec(vecSize);
錯(cuò)誤!vector是模板不是字面值常量類型,所以不滿足第一條。應(yīng)該改為 static vector<double> vec; //僅僅且只能進(jìn)行聲明,不能定義
然后在Example.cpp中進(jìn)行定義:
static vector<double> vec(Example::vecSize);
現(xiàn)在我們可以在Example.cpp中添加測(cè)試代碼進(jìn)行測(cè)試了:
#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;
}
執(zhí)行結(jié)果:
wanchouchou@wanchouchou-virtual-machine:~/c++/7.5$ ./Example 10.5 6.5 20
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
上一篇:C++中將string類型轉(zhuǎn)化為int類型
欄 目:C語言
下一篇:C/C++函數(shù)參數(shù)傳遞機(jī)制詳解及實(shí)例
本文標(biāo)題:C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1743.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
 - 01-10深入理解C++中常見的關(guān)鍵字含義
 - 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
 - 01-10c++中inline的用法分析
 - 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
 - 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
 - 01-10C++大數(shù)模板(推薦)
 - 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
 - 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
 - 01-10深入理解C/C++混合編程
 


閱讀排行
- 1C語言 while語句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
 - 01-10delphi制作wav文件的方法
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 04-02jquery與jsp,用jquery
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 


