如何在构造函数中初始化类的成员数组?
问题描述:
我试图做到以下几点:如何在构造函数中初始化类的成员数组?
class sig
{
public:
int p_list[4];
}
sig :: sig()
{
p_list[4] = {A, B, C, D};
}
我得到一个错误
在构造函数中缺少表达。
那么我该如何初始化一个数组?
答
在C++ 11只:
class sig
{
int p_list[4];
sig() : p_list { 1, 2, 3, 4 } { }
};
预-11不可能初始化比在块范围或静态的自动和静态的在名字空间域中其他阵列。
答
p_list[4] = {'A', 'B', 'C', 'D'};
答
那么我该如何初始化一个数组呢?
使用正常初始化器列表语法:
sig::sig() : p_list{1, 2, 3, 4}
{ }
注意,在C++ 11这仅适用。在此之前,您需要使用boost::array
将其初始化为一个函数。
答
如果你的编译器不支持C++ 11初始化,那么你必须每场separatly分配:
p_list[0] = A;
p_list[1] = B;
p_list[2] = C;
p_list[3] = D;
答
如果当前的编译器还不支持C++ 11,你可以初始化使用标准算法和函数的矢量内容:
class sig
{
public:
sig()
{
struct Functor
{
Functor() : value(0) {};
int operator()() { return value++; };
int value;
};
std::generate(p_list, p_list + 4, Functor());
}
int p_list[4];
};
上一个片段示例here。
是的,有点丑(至少对我来说看起来很丑)并且在编译时不做这项工作;但是它在构造函数中完成了你需要的工作。
如果您需要其他类型的初始化(使用偶数/奇数进行初始化,使用随机值进行初始化,以anoter值开始,等等......),您只需更改Functor,这是唯一的优点这个丑陋的方法。
答
可以使用-std = C++ 11或-std = GNU ++ 11选项
struct student {
private :
int marks[5];
public :
char name[30];
int rollno;
student(int arr[], const char *name, int rno):marks{arr[0], arr[1], arr[2], arr[3], arr[4]}{
strcpy(this->name, name);
this->rollno = rno;
}
void printInfo() {
cout <<"Name : "<<this->name<<endl;
cout <<"Roll No : "<<this->rollno<<endl;
for(int i=0; i< 5; i++) {
cout <<"marks : "<<marks[i]<<endl;
}
}
};
int main(int argc, char *argv[]) {
int arr[] = {40,50,55,60,46};
//this dynamic array passing is possible in c++11 so use option -std=c++11
struct student s1(new int[5]{40, 50, 55, 60, 46}, "Mayur", 56);
//can't access the private variable
//cout <<"Mark1 : "<<s1.marks[0]<<endl;
s1.printInfo();`enter code here`
}
初始化数组成员像这样使用C++编译器11我有C++ 10。所以我必须努力做到这一点。感谢你的回复。 – 2012-07-23 10:23:09
是sig():声明构造函数?如果它与问题的基本布局相匹配,这个答案对初学者会更有帮助,所以我们可以看到构造函数是如何工作的。什么是空的'{}'? – GreenAsJade 2016-08-13 02:19:06
为什么在初始化器之后没有';'? – GreenAsJade 2016-08-13 02:25:31