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

时间:2013-06-19 03:51:32

标签: c++ arrays char-pointer

为什么以下作业不起作用?如果可能的话,我想要一个低级别的解释。另外,这是我得到的编译器错误:将'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 
    }

};

5 个答案:

答案 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 ++会给你一个错误。