4

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

};
4

5 回答 5

4

因为当你有这样的函数调用时,UCSDStudent( char name[] )只会name复制数组的地址而不是整个数组。这是一个 C\C++ 特性。

此外,name定义的 aschar name [20]不是可修改的左值。

关于strcpy:它会带来未定义的行为,就好像您的源数组没有 NULL 字符一样,它也会复制一些垃圾this->name。你可以阅读更多关于strcpy 这里

于 2013-06-19T04:01:43.590 回答
1

如果您仍想将数组分配给数组,请使用循环。

例如:类 UCSDStudent {

char name[20];

public:

UCSDStudent( char name[] ) 
{

for(int i = 0; i<20; i++)
  {
  this-> name[i] = name[i];

  }
}
};  
于 2013-06-19T04:56:42.797 回答
1

让我们举这个例子。

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对应的条目。arr2arr1已经在符号表中分配了一些值。所以C++会给你一个错误。

于 2017-07-08T11:01:12.650 回答
1

因为您将名称分配为一个数组,所以您不能像那样复制,并且名称有 21 个计数。您必须使用“=”来复制一个 with 循环,并且您必须确定数组的计数。

 for(int i = 0; i<20; i++){

  this -> name[i]=name[i];   
  }
于 2017-02-11T23:10:32.723 回答
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;
    }
};

另请注意,如果您计划为所有成员变量设置 setter 和 getter,我是否可以推荐公共数据,至少如果该类没有class-invariant

于 2017-02-11T23:39:36.543 回答