【问题标题】:Why can't I assign an array to another?为什么我不能将一个数组分配给另一个数组?
【发布时间】:2010-12-07 14:56:53
【问题描述】:

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

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

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*

【问题讨论】:

标签: c++ arrays


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

【讨论】:

  • 感谢您的澄清帖子。事实上,我误解了很多基本概念。
【解决方案2】:

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

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

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

【讨论】:

  • +1 -- 请注意,虽然您可以这样做,但在大多数情况下,您应该使用std::vector :)
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2014-07-14
  • 2013-06-15
  • 1970-01-01
相关资源
最近更新 更多