C++靜態(tài)成員的類內(nèi)初始化詳解及實例代碼

C++ 靜態(tài)成員的類內(nèi)初始化詳解及實例代碼

創(chuàng)新互聯(lián)公司憑借專業(yè)的設計團隊扎實的技術支持、優(yōu)質(zhì)高效的服務意識和豐厚的資源優(yōu)勢,提供專業(yè)的網(wǎng)站策劃、網(wǎng)站制作、成都網(wǎng)站建設、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務,在成都10余年的網(wǎng)站建設設計經(jīng)驗,為成都成百上千家中小型企業(yè)策劃設計了網(wǎng)站。

一般來說,關于C++類靜態(tài)成員的初始化,并不會讓人感到難以理解,但是提到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ù)成員的聲明和定義有沒有錯誤,并解釋原因。

首先,要謹記:通常情況下,不應該在類內(nèi)部初始化成員,無論是否為靜態(tài)成員。

其次,若一定要在類內(nèi)初始化靜態(tài)成員,那么就必須滿足如下條件才行:

1) 靜態(tài)成員必須為字面值常量類型的constexpr。

      所謂的字面值類型就是通常遇到的:算術類型,引用,指針等。字面值常量類型就是const型的算術類型,引用,指針等。

      所謂的constexpr,就是常量表達式,指值不會改變且在編譯過程中就能得到計算結果的表達式。比如字面值,或者用常量表達式初始化的const對象也是常量表達式。為了幫助用戶檢查自己聲明/定義的變量的值是否為一個常量表達式,C++11新規(guī)定,允許將變量聲明為constexpr類型,以便由編譯器來進行驗證變量是否為常量表達式。

2)給靜態(tài)成員提供的初始值,必須為常量表達式

注意:在C++ primer 第五版中說:只能給靜態(tài)成員提供const 整數(shù)類型的類內(nèi)初始值,且該const整數(shù)類型的初始值必須是常量表達式。我覺得是有誤的!詳情見后面分析。

有了這兩條原則,我們就可以對上面的代碼進行驗證了。

1)static double rate = 6.5;

顯然不滿足第一條:因為rate不是常量類型。改成constexprt static const double rate = 6.5即可

從這里也可以看出初始值不一定必須為const 整數(shù)類型。

ps: 如果我們不再這里加入constexprt修飾符的話,編譯器會提示錯誤:error: ‘constexpr' needed for in-class initialization of static data member ‘const double Example::rate' of non-integral type [-fpermissive]

大體意思就是,對于非const整數(shù)類型的初始值,如果它是常量表達式的話,我們需要手工在前面添加修飾符constexprt。

至于Example.cpp文件中的定義部分,由于我們已經(jīng)在類內(nèi)部進行了初始化,就不需要再在類外部進行定義了。如果非要定義的話,必須采用如下格式:

//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);

現(xiàn)在我們可以在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;
}

執(zhí)行結果:

wanchouchou@wanchouchou-virtual-machine:~/c++/7.5$ ./Example 
10.5
6.5
20

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

文章名稱:C++靜態(tài)成員的類內(nèi)初始化詳解及實例代碼
標題URL:http://www.muchs.cn/article12/ghpodc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、定制開發(fā)、網(wǎng)頁設計公司、App開發(fā)、網(wǎng)站制作企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設