如何在构造函数中初始化类的成员数组?

8

我正在尝试做以下事情:

class sig
{
public:

int p_list[4];
}

sig :: sig()
{
p_list[4] = {A, B, C, D};
}

我遇到了一个错误

构造函数中缺少表达式。

那么我该如何初始化一个数组?

6个回答

19

仅适用于 C++11:

class sig
{
    int p_list[4];
    sig() : p_list { 1, 2, 3, 4 }   {   }
};

在 C++11 之前,不能在块作用域内初始化除自动和静态数组以外的其他数组,也不能在命名空间作用域内初始化除静态数组以外的其他数组。


我有C++10,所以我必须用较困难的方式来完成。感谢你们所有人的回复。 - chintan s
1
sig():声明构造函数吗?如果回答能够匹配问题的基本布局,那对于初学者来说会更有帮助,这样我们就可以看到构造函数是如何工作的。空的{}代表什么? - GreenAsJade
2
为什么在初始化程序之后没有 ; - GreenAsJade
假设c++11可用,如果在编译时不知道数组的值,有没有一种简洁的方式来初始化数组?我可以这样做:sig(float p[4]) : p_list{p[0], p[1], p[2], p[3]},但这似乎很笨拙。或者只是使用memcpy? - schrödinbug

8
那么,我该如何初始化一个数组呢? 使用普通的初始化列表语法:
sig::sig() : p_list{1, 2, 3, 4}
{ }

注意,这仅适用于C++11。在此之前,您需要使用boost::array并在函数内部初始化它。

5
如果您的编译器不支持C++11初始化,那么您需要单独为每个字段分配值:
p_list[0] = A;
p_list[1] = B;
p_list[2] = C;
p_list[3] = D;

2
如果您当前的编译器还不支持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];
};

之前的代码示例在这里

是的,这种方法有点丑(至少对我来说看起来很丑),并且不能在编译时完成工作;但是它可以在构造函数中完成你需要的工作。

如果你需要其他类型的初始化(使用偶数/奇数进行初始化、使用随机值进行初始化、从另一个值开始等),你只需要更改Functor,这是这种丑陋方法的唯一优点。


1
你可以使用c++11编译器的-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`
} 

-3
p_list[4] = {'A', 'B', 'C', 'D'};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接