標籤:變數 靜態變數 資料 源檔案 ini 內聯 符號 除了 成員變數
C++類有幾種類型的資料成員:普通類型、常量(const)、靜態(static)、靜態常量(static const)。這裡分別探討以下他們在C++11之前和之後的初始化方式。
c++11之前版本的初始化
在C++11之前常規的資料成員變數只能在建構函式裡和初始化列表裡進行初始化。const類型的成員變數只能在初始化列表裡並且必須在這裡進行初始化。static類型只能在類外進行初始化。static const類型除了整型數可以在類內初始化,其他的只能在類外初始化。代碼如下:
class A{public: A(); ~A(); //int m_n1 = 10; // 錯誤 1 error C2864: “A::m_n1”: 只有靜態常量整型資料成員才可以在類中初始化 int m_n2; int m_n3; //const int m_nConst_1 = 10; // 錯誤 3 error C2864: “A::m_nConst_1”: 只有靜態常量整型資料成員才可以在類中初始化 const int m_nConst_2; const int m_nConst_3; const int m_nConst_4; // static int m_nStatic_1 = 10; // 錯誤 1 error C2864: “A::m_nStatic_1”: 只有靜態常量整型資料成員才可以在類中初始化 static int m_nStatic_2; static int m_nStatic_3; // static double m_dStatic_1 = 10.1;// 帶有類內初始設定式的待用資料成員,必須具有不可變的常量整形類型,或必須被指定為“內聯” static double m_dStatic_2; static double m_dStatic_3; static const int m_nStaticConst_1 = 10; static const int m_nStaticConst_2; const static int m_nStaticConst_3; //static const double m_dStaticConst_1 = 10; // 錯誤 1 error C2864: “A::m_dStaticConst_1”: 只有靜態常量整型資料成員才可以在類中初始化 static const double m_dStaticConst_2; static const double m_dStaticConst_3;};
源檔案如下:
#include "Initialize.h"int A::m_nStatic_3 = 13; //類外初始化靜態變數// int A::m_nConst_4 = 13; 非待用資料成員不能在其類的外部定義const int A::m_nStaticConst_3 = 12; // 類外初始化靜態常量A::A():m_n3(12),m_nConst_2(11),m_nConst_3(12),m_nConst_4(13)//,m_dStaticConst_2(11.0)//, m_nStaticConst_3(12)// m_nStatic_3(13)// 不是類"A"的非待用資料成員或基類{// 錯誤 4 error C2758: “A::m_nConst_1”: 必須在建構函式基/成員初始值設定項列表中初始化 m_n2 = 11; // m_nConst_3 = 12; // 運算式必須是可修改的左值 // m_nStatic_2 = 12; // 無法解析外部符號 // m_dStatic_2 = 11.0; // 無法解析外部符號 // m_nStaticConst_2 = 11; // 運算式必須是可修改的左值 // m_dStaticConst_2 = 11.0; // 運算式必須是可修改的左值}A::~A(){}
如下表:
| type |normal | const | static | static const |
| -- | -- | -- | -- | --|
| 在聲明時初始化 | x | x | x | x(只有靜態常量整型才可以) |
| 初始化列表初始化 | √ | √ | x | x |
| 建構函式裡初始化 | √ | x | x | x |
| 類外初始化 | x | x | √ | √ |
C++11中初始化
在C++11中加入了類內初始化,常規的資料成員變數能在類內、建構函式裡和初始化列表裡進行初始化。const類型的成員變數只能在初始化列表裡並且必須在這裡進行初始化。static類型只能在類外進行初始化。static const類型除了整型數可以在類內初始化,其他的只能在類外初始化。代碼如下:
class A{public: A(); ~A(); int m_n1 = 10; int m_n2; int m_n3; double m_d1 = 10.0; const int m_nConst_1 = 10; const int m_nConst_2; const int m_nConst_3; const int m_nConst_4; // static int m_nStatic_1 = 10; // 帶有類內初始設定式的待用資料成員,必須具有不可變的常量整形類型,或必須被指定為“內聯” static int m_nStatic_2; static int m_nStatic_3; // static double m_dStatic_1 = 10.1;// 帶有類內初始設定式的待用資料成員,必須具有不可變的常量整形類型,或必須被指定為“內聯” static double m_dStatic_2; static double m_dStatic_3; static const int m_nStaticConst_1 = 10; static const int m_nStaticConst_2; static const int m_nStaticConst_3; //static const double m_dStaticConst_1 = 10; // E1591 "const double" 類型的成員不能包含類內初始值設定項 static const double m_dStaticConst_2; static const double m_dStaticConst_3;};
源檔案代碼如下:
int A::m_nStatic_3 = 13;// int A::m_nConst_4 = 13; 非待用資料成員不能在其類的外部定義const double A::m_dStaticConst_2 = 12.0;A::A():m_n3(12),m_nConst_2(11),m_nConst_3(12),m_nConst_4(13)//, m_nStaticConst_3(12)// m_nStatic_3(13)// 不是類"A"的非待用資料成員或基類{ m_n2 = 11; // m_nConst_3 = 12; // 運算式必須是可修改的左值 // m_nStatic_2 = 12; // 無法解析外部符號 // m_dStatic_2 = 11.0; // 無法解析外部符號 // m_nStaticConst_2 = 11; // 運算式必須是可修改的左值 // m_dStaticConst_2 = 11.0; // 運算式必須是可修改的左值}A::~A(){}
如下表:
type |
normal |
const |
static |
static const |
在聲明時初始化 |
√ |
x |
x |
x(只有靜態常量整型才可以) |
初始化列表初始化 |
√ |
√ |
x |
x |
建構函式裡初始化 |
√ |
x |
x |
x |
類外初始化 |
x |
x |
√ |
√ |
C++中類中常規變數、const、static、static const(const static)成員變數的聲明和初始化