2012-01-31 136 views
3

在C++中如何初始化一個類的成員數組的所有值?C++初始化一個類的成員數組的所有值

#define MAX_MATRIX 20 
Class Matrix { 
public: 
     Matrix(); //constructor 
protected: 
     int n[MAX_MATRIX]; // note cannot do = { 0} or w/e here 
}; 

Matrix::Matrix() 
{ 
    // how to set all n to -1? 
} 

回答

0
for (unsigned i = 0; i < MAX_MATRIX; ++i) n[i] = -1; 
6

您可以使用std::fill

std::fill(begin(n), end(n), -1); 

(這些beginend功能可以在命名空間std在C++ 11中找到,或者你可以很容易地在implement them yourself C++ 03 )

+0

問題甚至不C++ 11存在;-) – 2012-01-31 04:13:21

2

有這種類型:

class Matrix { 
public: 
    Matrix() : n() { n.fill(-1); } 
protected: 
    std::array<int, 20> n; 
}; 
0
#include <cstring> 

...

Matrix::Matrix() 
{ 
static bool init=false; 
static int n_init[MAX_MATRIX]; 
if (!init){ 
    for(int i=0; i<MAX_MATRIX; i++){ 
    n_init[i] = -1; 
    } 
    init = true; 
} 
memcpy(n,n_init,MAX_MATRIX*sizeof(int)); 
} 

陣列n_init正好一次初始化並存儲在內存中,然後所有的後續建設是一個快速的內存拷貝,沒有循環。如果您在循環索引時增加MAX_MATRIX的大小,則速度應該不會降低,尤其是在多次撥打Matrix::Matrix()時。

4

這是C++ 03的明顯缺點。在C++ 11這已得到修復,並且現在可以初始化的一切,包括數組:

class Matrix 
{ 
public: 
    Matrix() : n { } { } 
protected: 
    static const unsigned int MAX_MATRIX = 20; 
    int n[MAX_MATRIX]; 
}; 

(也沒有必要用C討厭的預處理宏++)

在C++ 03,你只需不能初始化一個數組成員,但你可以設置它在構造函數體中有意義的東西,例如通過std::fill(n, n + MAX_MATRIX, 0);

(當然,這將是一個要好很多,說std::array<int, MAX_MATRIX> n;。)