C++ 通过构造函数初始值设定项初始化私有成员数组';c++;

C++ 通过构造函数初始值设定项初始化私有成员数组';c++;,c++,arrays,initializer-list,C++,Arrays,Initializer List,在通过初始值设定项列表查看了有关聚合成员初始化的所有问题后,我仍然有一个问号???我尝试了这两种方法来初始化私有成员数组 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]; }; C类{

在通过初始值设定项列表查看了有关聚合成员初始化的所有问题后,我仍然有一个问号???我尝试了这两种方法来初始化私有成员数组

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];
};
C类{
C(const-vector&a):使用向量的m_数组(a){}//
私人:
C(初始值设定项列表a):使用初始值设定项列表的m_数组(a){}//
int m_数组[6];
};

上述两种方法都会在VisualStudio2010中抛出错误“无法为数组指定显式初始值设定项”。有人能解释一下这些方法是否正确吗?如果是,那么为什么会出现这些错误…

这两种结构都要求数组的构造函数具有一个类型为
std::vector
std::initializer\u list
的参数。但是,数组是聚合的。它们没有带参数的构造函数

您应该在构造函数的主体中初始化数组

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

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];
};
比如说

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

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

.

这两种构造都要求数组的构造函数具有一个类型为
std::vector
std::initializer\u list
的参数。但是,数组是聚合的。它们没有带参数的构造函数

您应该在构造函数的主体中初始化数组

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

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];
};
比如说

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

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

当你说m_数组(a)时。为了使其有效,m_array应该是某个类(比如ArrayClass)的对象,该类应该有一个参数化构造函数,该构造函数接受您指定的参数

现在在您的例子中,m_数组表示指向数组m_数组[]的第一个元素的指针。很简单,构造函数是为对象而不是指针调用的。写入m_array(a)意味着您想要执行m_array=a,这是根本错误的,因为数组是在堆栈上分配的,其基址无法修改,并且您正在尝试修改数组的基址

你能做的就是

  • 将一个向量作为成员,该向量的构造函数将负责 复制元素的方法
  • 编写自己的数组类
  • 使用指针(浅拷贝)
  • 当你说m_数组(a)时。为了使其有效,m_array应该是某个类(比如ArrayClass)的对象,该类应该有一个参数化构造函数,该构造函数接受您指定的参数

    现在在您的例子中,m_数组表示指向数组m_数组[]的第一个元素的指针。很简单,构造函数是为对象而不是指针调用的。写入m_array(a)意味着您想要执行m_array=a,这是根本错误的,因为数组是在堆栈上分配的,其基址无法修改,并且您正在尝试修改数组的基址

    你能做的就是

  • 将一个向量作为成员,该向量的构造函数将负责 复制元素的方法
  • 编写自己的数组类
  • 使用指针(浅拷贝)

  • 这是一项
    C++11
    功能,在VS2010中不受支持@Cyber这不重要,在c++11中也不合法。正如Vlad所说,数组没有带参数的构造函数。@luk32如果您是正确的,那么无论哪种方式,它们的使用都是不正确的。我只是注意到,在这个版本的VS @ LUK32中,他们根本不应该使用初始化列表——总是要知道编译器的C++ 11完整性。它会改变什么?这是一个
    C++11
    功能,在VS2010中不受支持@Cyber这不重要,在c++11中也不合法。正如Vlad所说,数组没有带参数的构造函数。@luk32如果您是正确的,那么无论哪种方式,它们的使用都是不正确的。我只是注意到,在这个版本的VS @ LUK32中,他们根本不应该使用初始化列表——总是要知道编译器的C++ 11完整性。它会有什么变化?我尝试在构造函数体中进行初始化,即使使用最简单的方法“arr={31,41}”,它也不起作用。同样的错误仍然存在。我只想以更解释的方式了解它背后的原因。@user3625742数组没有赋值运算符。@Neha不是arr指针吗?数组初始化在声明时完成,也使用arr[]={1,2,3};我尝试在构造函数体中进行初始化,即使使用“arr={31,41}”这样最简单的方法,它也不起作用。同样的错误仍然存在。我只想以更解释的方式了解它背后的原因。@user3625742数组没有赋值运算符。@Neha不是arr指针吗?数组初始化在声明时完成,也使用arr[]={1,2,3};