簡體   English   中英

如何使用C ++初始化const char數組數據成員?

[英]How to initialize a const char array data member with C++?

我有一個與C ++類成員初始化有關的問題。 以下代碼說明了我的問題:

class ABCD
{
public:
    ABCD():ObjNum(3){};
    ~ABCD() {};
     static const  unsigned char getByte[8];
     const int ObjNum;


};

const unsigned char ABCD::getByte[8] = {
    'a','b','c','d','e','f','g','h'
};

int main() 
{
     ABCD test;
     cout<<test.getByte[3]<<endl;


     return 0;
}

上面的代碼可以很好地工作,但是現在如果我不將getByte [8]設置為靜態的話,如何初始化該類? 我已經嘗試過這種方式,但是失敗了:

class ABCD
{
public:
    ABCD():ObjNum(3),getByte('a','b','c','d','e','f','g','h')
    {

    };
    ~ABCD() {};
    const  unsigned char getByte[8];
     const int ObjNum;


};



int main() 
{
     ABCD test;
     cout<<test.getByte[3]<<endl;


     return 0;
}

我得到的錯誤如下:

 error C2536: 'ABCD::ABCD::getByte' : cannot specify explicit initializer for arrays

我知道收到錯誤的原因,但我不知道如何解決。 任何的想法? 謝謝!

在C ++ 11中,您可以像這樣初始化它:

ABCD() : ObjNum(3), getByte{'a','b','c','d','e','f','g','h'} {}

但是,如果要使用C ++ 11,則最好使用std::array就像其他人在注釋中建議的那樣。 然后可以像這樣定義數組:

const std::array<unsigned char, 8> getByte;

並以這種方式將其初始化(請注意雙括號):

ABCD() : ObjNum(3), getByte{{'a','b','c','d','e','f','g','h'}} {}

在C ++ 11中,您可以像這樣初始化數組:

ABCD() : getByte { 'a','b','c','d','e','f','g','h' }
{ ... }

如果您具有與C ++ 11兼容的編譯器,則應該可以這樣使用:

ABCD():ObjNum(3),getByte{'a','b','c','d','e','f','g','h'}

但是,如果編譯器無法處理,則必須在構造函數中手動初始化數組,可以逐個元素地進行初始化,也可以通過擁有另一個數組來進行初始化,例如執行 memcpy

編輯:如果您的編譯器無法處理C ++ 11語法,則您很不走運。 但是,至少從4.4版以及VC ++ 2010起的GCC都可以處理它。 因此,除非您有強制使用“古老”編譯器的要求,否則這不是問題。

最好放棄C數組。 在C ++中,最好使用std :: string。 在這種情況下:

class A
{
public:
   A() : s("abcdefgh") {}

private:
   std::string s;
}

在C ++ 11中,您可以使用std :: array並使用std :: initializer_list

class A
public:
   A() : s{'a','b','c','d','e','f','g','h'} {}

private:
   std::array<8> s;
}

在C ++ 03中,您可以將成員更改為boost :: array類型,並使用返回boost::array<char,8>的函數在構造函數中對其進行初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM