为什么我不能将数组分配给另一个?

时间:2010-12-07 14:56:53

标签: c++ arrays

我似乎无法理解以下代码无法编译的原因。

在我的头文件中,我将数组声明为静态类成员:

class foo {
private:
#define SIZE 50
static char array[SIZE];
// further code goes here
}

在实现中,我必须初始化数组。

char foo::array[SIZE] = new[] char[SIZE];

每次都会产生错误 - 编译器说:

  

无法从'char *'转换为'char [50]'

为什么编译器会将new[] char[SIZE]解释为char*

2 个答案:

答案 0 :(得分:9)

  1. 没有new []这样的东西。您需要删除[]
  2. 因为::operator new返回指针而不是数组。指针不是数组,并试图互换地处理这两个将导致痛苦。仅仅因为数组会衰减为指针并不意味着数组是指针。
  3. foo::array[SIZE]已经static - 无论如何都不需要为它分配存储空间。
  4. 这看起来像是来自Java或C#背景,其中数组是引用类型。数组不是C ++中的引用类型。声明数组时,它的存储是隐式的。在您的情况下,存储将是所有其他static的存储;如果数组只是在函数中没有static的情况下编写,那么它将被分配在堆栈中。

答案 1 :(得分:1)

在C ++中,数组几乎就像常量指针(char * const,而不是char const *)。如果将指针指定给另一个指针,则只需复制地址,而不是值。

正如Billy所说,在你的情况下,你不需要为数组分配内存,它已经被分配,因为你将它声明为具有固定长度的静态数组。如果要在运行时已知长度的堆或数组上创建对象,则使用operator new。你可以这样:

class A{
public:
    A(int s): array_(new char[s]), length_(s) {}
    ~A() { delete [] array_; }
private:
    char * const array_;
    int length_;
};