为什么以下作业不起作用?如果可能的话,我想要一个低级别的解释。另外,这是我得到的编译器错误:将'char *'赋值给'char [20]'的不兼容类型
class UCSDStudent {
char name[20];
public:
UCSDStudent( char name[] ) {
//this-> name = name; does not work! Please explain why not
strcopy( this -> copy, copy ); //works
}
};
答案 0 :(得分:3)
因为当你有一个像UCSDStudent( char name[] )
这样的函数调用时,只会复制数组name
的地址而不是整个数组。它是一个C \ C ++特性。
此外,定义为name
的{{1}}不是可修改的左值。
关于char name [20]
:它会带来未定义的行为,就好像你的源数组没有NULL字符一样,它也会将一些垃圾回复到strcpy
。您可以阅读有关this->name
here
答案 1 :(得分:1)
如果您仍想将数组分配给数组,请使用循环。
例如: UCSDStudent课程 {
char name[20];
public:
UCSDStudent( char name[] )
{
for(int i = 0; i<20; i++)
{
this-> name[i] = name[i];
}
}
};
答案 2 :(得分:1)
因为您将名称分配为数组,所以您不能像这样复制,并且有21个计数名称。必须使用“=”复制with循环,并且必须识别数组的计数。
for(int i = 0; i<20; i++){
this -> name[i]=name[i];
}
答案 3 :(得分:0)
c风格的数组不能像这样复制 复制一个,你必须复制内容:
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10];
std::copy(arr1, arr1+10, arr2);
// std::copy() lives in <algorithm>
// content of arr2 is a now copy of arr1
但是,最好避免像c风格数组这样的低级功能。
如果您真正想要的是可变长度字符串,请使用std::string
相反,它支持通过赋值运算符进行复制。
如果你真的想要一个固定长度的数组,请改用std::array<T,N>
,
它还支持通过赋值运算符进行复制。
另请注意,建议参数名称和成员变量名称是不同的,除了使用成员初始化语法的构造函数:
#include <string>
class UCSDStudent
{
std::string name;
public:
UCSDStudent( std::string name )
: name(name)
{
}
void SetName( std::string new_name )
{
name = new_name;
}
};
另请注意,如果您计划为所有会员设置制定者和吸气剂 变量,我可以推荐公共数据,至少在类中 没有class-invariant。
答案 4 :(得分:0)
让我们举个例子。
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
对于C ++,数组名arr1
没有获得单独的内存位置。确实arr1
保留了arr1[0]
的内存位置,但这更像是过于简单化了。在C ++中引用数组的方式是通过符号表。创建数组时,实际发生的事情对应于arr1
在编译时在符号表中创建的条目,此条目包含有关数据类型arr1
引用的信息(这是整数类型数组)和地址arr1[0]
。现在,这里有趣的事情。在符号表中创建条目后,C ++不允许更改它。
如果您执行arr1=arr2
,那么您实际上要做的是将arr1
重新分配给符号表中与arr2
对应的条目。但arr1
已在符号表中分配了一些值。所以C ++会给你一个错误。