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,这是根本错误的,因为数组是在堆栈上分配的,其基址无法修改,并且您正在尝试修改数组的基址
你能做的就是
这是一项
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};