通过 C++ 中的构造函数初始值设定项列表初始化私有成员数组

private member array initialization through constructor initializer's list in c++

本文关键字:初始化 列表 数组 成员 C++ 构造函数 通过      更新时间:2023-10-16

在通过初始化器列表询问有关聚合成员初始化的所有问题后,我仍然留下问号??我已经尝试了这两种方法来初始化私有成员数组。

class C {
  C(const vector<int> &a): m_array(a) {} // using vector 
 private:
  C(initializer_list<int> a): m_array(a) {} //using initializer list
  int m_array[6];
};

以上两个方法在visual studio 2010中都会抛出错误"cannot specify explicit initializer for arrays"。谁能解释一下这些方法是否正确,如果是,那么为什么会出现这些错误。

这两种结构都要求数组具有一个参数类型为std::vector<int>std::initializer_list<int>的构造函数。然而,数组是聚合。它们没有带参数的构造函数。

应该在构造函数体中初始化数组。

一种方法是声明指向数组第一个元素的指针作为形参,并在构造函数体中声明,以复制数据成员数组中的元素。

例如

C( const int *a, size_t n )
{
   std::copy_n( a, std::min<size_t>( n, 6 ), array );
}

另一种方法是使用标准类std::array。例如

std::array<int, 6> array;
C( std::array<int, 6> ): array(a) {}

在最后一种情况下,构造函数可以被调用为

C( { 1, 2, 3, 4, 5, 6 } );

.

当你说m_array(a)。要使此操作有效,m_array必须是某个类(如ArrayClass)的对象,该类应该具有参数化构造函数,该构造函数接受指定的实参。

现在在你的例子中,m_array代表指向数组m_array[]的第一个元素的指针。很简单地说,构造函数是为对象而不是指针调用的。写m_array(a)意味着你想做m_array = a,这从根本上是错误的,因为数组是在堆栈上分配的,它的基址不能修改,你试图修改数组的基址。

你能做的是

  1. 将vector作为成员,该vector的构造函数负责处理
  2. 写你自己的数组类
  3. 使用指针(浅拷贝)