C++初始化类的成员数组的所有值

C++ initialize all values of a member array for a class

本文关键字:数组 成员 初始化 C++      更新时间:2023-10-16

在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?
}

您可以使用std::fill:

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

(这些beginend函数可以在C++11中的命名空间std中找到,或者您可以在C++03中轻松地自己实现它们)

这是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;要好得多。)

有一种类型:

class Matrix {
public:
    Matrix() : n() { n.fill(-1); }
protected:
    std::array<int, 20> n;
};
for (unsigned i = 0; i < MAX_MATRIX; ++i) n[i] = -1;
#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()的情况下,应该不会看到速度下降太多。