2012-08-06 343 views
18

我有可以在以下概括的情況恆定大小的數組:初始化在初始化列表

class Test 
{ 

    Test(); 

    int MySet[10]; 

}; 

是可以初始化的初始化列表MySet

喜歡這種初始化列表:

Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {} 

有什麼方法來初始化類的initalizer列表中選擇一個固定大小的成員數組?

+3

支持對於它的價值,'Set'不只是一個指針數組「10」整數,在這裏也不是「靜態」。相反,在某些情況下,數組名稱「Set」衰減爲指向數組的第一個元素的指針。差異可以用'sizeof'清楚地看到 - 即sizeof(Set)== 10 * sizeof(int)!= sizeof(int *)'。 – 2012-08-06 22:59:18

+1

@StuartGolodetz感謝您的澄清。當我說靜態時,我的意思是靜態的形式,它與對象/實例一起存儲,而不僅僅是堆中的其他地方。當然,這是對我而言「靜態」一詞的嚴重濫用;抱歉。 – Serge 2012-08-06 23:00:58

+0

不用擔心:)我主要是試圖澄清數組和指針之間的區別,以避免可能在那裏出現誤解。 – 2012-08-06 23:53:24

回答

21

而在C++ 03,C++ 11引入擴展初始化列表不可用。如果使用符合C++ 11標準的編譯器,你確實可以做到這一點。

struct Test { 
    Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { }; 
    int set[10]; 
}; 

上面的代碼使用g++ -std=c++0x -c test.cc編譯罰款。


正如指出下面我通過在註釋中一個非常有用的用戶,此代碼不使用微軟的VC++編譯器,CL編譯。也許有人可以告訴我,如果使用std::array將等於?

#include <array> 

struct Test { 
    Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { }; 
    std::array<int, 10> set; 
}; 

這也編譯罰款使用g++ -std=c++0x -c test.cc

+2

愛C++ 11(或它的某些部分)的另一個好理由! = D非常感謝! – Serge 2012-08-06 23:03:50

+0

@Serge沒問題! – oldrinb 2012-08-06 23:06:40

+5

請注意,此代碼不能用Visual C++版本11和更早版本進行編譯(即,它不會與Microsoft Visual Studio 2012一起編譯,而Visual C++是最常見平臺的主編譯器)。所以,**如果你想要便攜式代碼,不要這樣做**。然而。 – 2012-08-06 23:18:50

3

「據我所知,是集只是一個指向10個整數靜態數組」

不,這是錯誤的:它是一個數組,而不是一個指針。

您仍然可以在構造函數的初始化程序列表中初始化它。

對於不支持C++ 11大括號初始化(Visual C++版本11和更早想到),你必須通過一些箍雖然跳,如下圖所示編譯:

#include <iostream> 
#include <vector> 
using namespace std; 

#define CPP11 
#if defined(_MSC_VER) 
# if (_MSC_VER <= 1700) 
#  undef CPP11 
# endif 
#endif 

#ifdef CPP11 
class Cpp11 
{ 
private: 
    int set_[10]; 

public: 
    Cpp11() 
     : set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } 
    {} 

    int foo() const { return set_[3]; } 
}; 
#endif 

class Cpp03 
{ 
private: 
    struct IntArray10 { int values[10]; }; 
    IntArray10 set_; 

    static IntArray10 const& oneToTen() 
    { 
     static IntArray10 const values = 
      { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} }; 
     return values; 
    } 

public: 
    Cpp03() 
     : set_(oneToTen()) 
    {} 

    int foo() const { return set_.values[3]; } 
}; 

int main() 
{} 

而是使用原始陣列,雖然使用std::vector和C+++ 11 std::array,兩者甚至VISUAL C++ 11