如何在成员初始化列表中初始化数组

时间:2015-05-30 22:15:54

标签: c++ arrays

用C ++完成初学者。

这是一个成员初始化列表:

Student.cpp

Student::Student(int studentID ,char studentName[40]) : id(studentID), name(studentName){};

Student.h

class Student{

protected:
    char name[40];
    int id;
}

我的问题是name的类型为char[40],因此,name(studentName)显示错误:

a value of type "char *" cannot be used to initialize an entity of type "char [40]"

如何在成员初始化列表中初始化name数组到studentName数组? 我不想使用字符串,我尝试strcpy并且没有工作

2 个答案:

答案 0 :(得分:4)

由于你不能用其他数组初始化(原始)数组,甚至用C ++分配数组,你基本上有两种可能:

  1. 惯用的C ++方式是使用std::string,任务变得微不足道:

    class Student{
    public:
        Student(int studentID, const std::string& studentName)
        : id(studentID), name(studentName) {}
    protected:
        std::string name;
        int id;
    };
    

    然后,在需要时,您可以通过调用char成员函数从name获取基础原始c_str数组:

    const char* CStringName = name.c_str();
    
  2. 如果您想使用char数组,事情会变得更复杂。您可以先对数组进行默认初始化,然后使用strcpy

    将其填充到构造函数体中
    class Student{
    public:
        Student(int studentID, const char* studentName)
        : id(studentID) {
            assert(strlen(studentName) < 40); // make sure the given string fits in the array
            strcpy(name, studentName);
        }
    protected:
        char name[40];
        int id;
    };
    

    请注意,参数char* studentNamechar studentName[40]相同,因为您无法按值将数组作为参数传递,这就是编译器将其视为{{1}的原因指向数组中的第一个char*

答案 1 :(得分:1)

您不能隐式复制数组,它们只是没有此功能。以下是您可以做的事情:

您拥有的最佳选择是安全使用std::string而不是char[]的名称。这可以作为你的例子,但可以处理任意长度的名称。

另一种选择是std::array<char, 40>。这与您现在使用的char[]几乎相同,但具有可复制的优点。它也适用于您展示的代码。与string选项不同,这可以是简单的可复制的,即您可以例如以二进制数据的形式发送和接收它。

如果确实希望或需要使用char[],则需要手动复制字符串&#34;&#34;:

Student::Student(int studentID ,char studentName[40]) : id(studentID){
    std::strcpy(name, studentName);
}