I ++初始化数组的C ++指针

时间:2015-01-21 21:22:22

标签: c++ arrays initialization fill

我想让一个类的所有函数都可以访问一个数组。

我将数组作为私有变量放在头文件中。

    private:
    int* arrayName;

在我实现类的.cpp文件中,构造函数接受一个int值(大小)并创建数组。目标是填补它

ClassName::ClassName(int numElements){
  arrayName = new int[numElements]; //make arrays the size of numElements
  for(int i = 0; i<numElements; i++)
      arrayName[i] = 0;
}

我觉得这样效率很低。我知道你可以做int array [5] = {0};但是当你最初不知道它的大小时,你怎么做呢。

3 个答案:

答案 0 :(得分:6)

如果要对新建数组进行零初始化,只需执行 value-initialize 即可。这具有零初始化其元素的效果:

arrayName = new int[numElements]();
//                              ^^

但你真的想要使用std::vector<int>

private:
  std::vector<int> vname;

ClassName::ClassName(int numElements) : vname(numElements) {}

这样您就不必担心删除数组并实现复制构造函数和赋值运算符。

答案 1 :(得分:0)

您可以使用memset功能:

memset(arrayName,0,sizeof(int)*numElements);

void * memset ( void * ptr, int value, size_t num );函数将ptr指向的内存块的前NUM个字节设置为指定值(解释为unsigned char)。

要使用它,您必须包含string.h标题文件。

有关详细信息:http://www.cplusplus.com/reference/cstring/memset/

答案 2 :(得分:0)

您要做的是按需逐步扩展阵列。

 arrayName = new int[numElements];
 for(int i = 0; i<numElements; i++)
       arrayName[i] = 0;

上面的代码(你给的)将给你一个大小为numElements的数组,然后for循环将填充它。这是现在分配的,并且根据我的理解,它可以简单或轻松地调整大小(memset将覆盖数组中先前保存的值)。

您可以在每次要调整大小时复制整个数组:

 int * oldarr = new int[OldSize];
 //fill your old array

 int * newarr = new int[NewSize];
 for(int i = 0; i<OldSize; i++)
       newarr[i] = oldarr[i];

除此之外,你可以使数组更大,或者你可以使用各种STL,例如std :: vector。可以使用简单的push_back函数增加向量,并允许[]操作符访问(如arr [5]和诸如此类的东西)。

希望这有帮助!