C++11(一):在類的定義時初始化非靜態變數
阿新 • • 發佈:2019-01-09
前言
距離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
即可,注意要在類定義之後。