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

时间:2012-07-23 10:03:00

标签: c++

我正在尝试执行以下操作:

class sig
{
public:

int p_list[4];
}

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

我收到错误

  

在构造函数中缺少表达式。

那么如何初始化数组?

6 个答案:

答案 0 :(得分:17)

仅在C ++ 11中:

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

Pre-11无法在块范围内初始化除自动和静态数组之外的数组,或在命名空间范围内初始化静态数组。

答案 1 :(得分:8)

  

那么如何初始化数组?

使用常规初始化列表语法:

sig::sig() : p_list{1, 2, 3, 4}
{ }

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

答案 2 :(得分:4)

如果您的编译器不支持C ++ 11初始化,那么您必须分别分配每个字段:

p_list[0] = A;
p_list[1] = B;
p_list[2] = C;
p_list[3] = D;

答案 3 :(得分: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];
};

上一个代码段示例here

是的,有点难看(至少,它对我来说看起来很难看)并且在编译时不做这项工作;但它完成了构造函数中所需的工作。

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

答案 4 :(得分: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`
} 

答案 5 :(得分:-3)

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