1. 程式人生 > >C++中類中常規變數、const、static、static const(const static)成員變數的宣告和初始化

C++中類中常規變數、const、static、static const(const static)成員變數的宣告和初始化

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