1. 程式人生 > >C++11(一):在類的定義時初始化非靜態變數

C++11(一):在類的定義時初始化非靜態變數

前言

距離C++11標準釋出時間大約有六年了,但是C++11的諸多特性並未在程式界達到普及的狀態,甚至在一些“老程式設計師”看來,由於他們不了C++11標準新加入的內容,一些正常的程式常常被當做BUG處理,接下來我們就看看C++11加了那些特性,今天我們來測試一下:“在類的定義時初始化非靜態變數”。不得不承認我在這一點上也犯過錯誤,我們一起來看一下。

測試環境

  • 作業系統:Windows 7 x64 Service Pack 1
  • 開發環境:Visual Studio 2008 (代表C++03)
  • 對比環境:Visual Studio 2015 (代表C++11)

測試內容

  • 在VS2008上的測試程式碼級編譯結果(參考註釋)
#include <iostream>
using namespace std;

// using c++03 standard
class CTest03
{
public:
    static const int a = 3; // Ok in C++03
    static int b = 4;       // Error
    const int c = 5;        // Error
    int d = 6;              // Error
public:
    CTest03():c(0) { }      // Ok in C++03
};

int main()
{
    CTest03 testObj;
    cout
<< testObj.a << testObj.b << testObj.c << testObj.d << endl; return 0; }
  • VS2008編譯結果

    error C2864: “CTest03::b”: 只有靜態常量整型資料成員才可以在類中初始化
    error C2864: “CTest03::c”: 只有靜態常量整型資料成員才可以在類中初始化
    error C2864: “CTest03::d”: 只有靜態常量整型資料成員才可以在類中初始化

  • 在VS2015上的測試程式碼級編譯結果(參考註釋)

// using c++11 standard
class CTest11 { public: static const int a = 3; // Ok in C++11 static int b = 4; // Error const int c = 5; // Ok in C++11 int d = 6; // Ok in C++11 public: CTest11() :c(0) { } // Ok in C++11 }; int main() { CTest11 testObj; cout << testObj.a << testObj.b << testObj.c << testObj.d << endl; return 0; }
  • VS2015編譯結果
    error C2864: “CTest11::b”: 帶有類內初始值設定項的靜態 資料成員 必須具有不可變的常量整型
    note: 型別是“int”

總結

根據上述的程式碼和編譯結果,以及實際的操作除錯發現

  • 對於static const 型別的成員變數不管是舊的C++標準還是C++11都是支援在定義時初始化的。
  • 對於static 非const型別的成員變數C++03和C++11的標準都是不支援在定義時初始化的。
  • 對於const 非static型別的成員變數C++03要求必須在建構函式的初始化列表中來初始化,而C++11的標準支援這種寫法,同時允許在定義時進行初始化操作。
  • 對於非static 非const成員變數,C++03標準不允許在成員變數定義時初始化,但是C++11標準允許在類的定義時對這些非靜態變數進行初始化
  • 對於static非const成員變數的初始化方式並未改變,就是在相應的cpp檔案中寫成int CTest11::b = 5即可,注意要在類定義之後。