用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
并且没有工作
答案 0 :(得分:4)
由于你不能用其他数组初始化(原始)数组,甚至用C ++分配数组,你基本上有两种可能:
惯用的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();
如果您想使用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* studentName
与char 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);
}