我似乎无法理解以下代码无法编译的原因。
在我的头文件中,我将数组声明为静态类成员:
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*
?
答案 0 :(得分:9)
new []
这样的东西。您需要删除[]
。::operator new
返回指针而不是数组。指针不是数组,并试图互换地处理这两个将导致痛苦。仅仅因为数组会衰减为指针并不意味着数组是指针。foo::array[SIZE]
已经static
- 无论如何都不需要为它分配存储空间。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_;
};