为什么我不能使用"="运算符将数组变量直接分配给另一个数组变量?
Why can't I assign an array variable directly to another array variable with the '=' operator?
为什么下面的赋值不能工作?如果可能的话,我想要一个简单的解释。此外,这是我得到的编译器错误:'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
}
};
因为当您有这样的函数调用UCSDStudent( char name[] )
时,只有数组name
的地址被复制,而不是整个数组。这是C c++的特性。
此外,name
定义为char name [20]
是不可修改的左值。
关于strcpy
:它会带来未定义的行为,如果你的源数组没有NULL字符,它也会复制一些垃圾到this->name
。你可以在这里阅读更多关于strcpy
的信息
如果你仍然想给数组赋值,可以使用循环。
例如:类UCSDStudent{
char name[20];
public:
UCSDStudent( char name[] )
{
for(int i = 0; i<20; i++)
{
this-> name[i] = name[i];
}
}
};
因为你将name赋值为数组所以你不能像那样复制name有21个计数。必须使用"="来复制一个with循环,并且必须确定数组的计数。
for(int i = 0; i<20; i++){
this -> name[i]=name[i];
}
让我们来看看这个例子。
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++会给你一个错误
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;
}
};
还要注意,如果您计划为所有成员设置setter和getter变量,我是否可以推荐公共数据代替,至少如果类没有类不变量
- 将数组的地址分配给变量并删除
- 试图让变量检查数组中的某些内容
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 在C++中将变量 wstring 分配给 Char 数组
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- c++ 中的别名变量数组
- 使用类的其他成员变量定义类的成员变量数组
- 可视化 如何在C++中使用复杂变量数组
- 如何 for 循环类变量数组
- 按变量数组中的列将一组整数从文本文件读入
- 运行时C++中的变量数组维度
- C++变量数组
- 将变量(数组类型)从函数传递到"main"范围类型:标准::tr1::match_results<标准::字符串::const_iterator>
- 在堆栈上使用大变量/数组的缺点
- 如何在继承类中创建父类变量数组作为私有成员
- 如何创建一个类变量数组
- 需要以编程方式初始化类变量数组,我怎么做最好
- 直接使用变量(数组中的数据返回相同)或与指针一起使用
- 如何用模板类型初始化成员变量数组