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

來源:互聯網
上載者:User

標籤:變數   靜態變數   資料   源檔案   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)成員變數的聲明和初始化

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.