为什么我不能使用"="运算符将数组变量直接分配给另一个数组变量?

Why can't I assign an array variable directly to another array variable with the '=' operator?

本文关键字:变量 数组 分配 另一个 不能 运算符 为什么      更新时间:2023-10-16

为什么下面的赋值不能工作?如果可能的话,我想要一个简单的解释。此外,这是我得到的编译器错误:'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变量,我是否可以推荐公共数据代替,至少如果类没有类不变量