我有一个这样的课程
class aClass
{
public:
aClass() : N(5) {}
void aMemberFunction()
{
int nums[N] = {1,2,3,4,5};
}
private:
const int N;
};
测试代码是
int main()
{
aClass A;
A.aMemberFunction();
const int N = 5;
int ints[N] = {5,4,3,2,1};
return 0;
}
编译时(g ++ 4.6.2 20111027),我收到错误
problem.h: In member function ‘void aClass::aMemberFunction()’:
problem.h:7:31: error: variable-sized object ‘nums’ may not be initialized
如果我用int nums[N]
注释掉这一行我没有收到编译错误,那么ints
数组的类似代码就可以了。编译时是否知道N
的值?
发生了什么?为什么nums
被认为是一个可变大小的数组?为什么数组nums
和ints
的处理方式不同?
答案 0 :(得分:9)
编译时是否知道
N
的值?
没有。在编译aMemberFunction
时,编译器现在不是N
,因为它的值是在运行时确定的。看到只有一个构造函数并且假设N
的值可能不等于5,这是不够智能的。
答案 1 :(得分:3)
N
在编译时是未知的,但它位于以下位置:
class aClass
{
private:
static const int N = 5;
public:
aClass() {}
void aMemberFunction()
{
int nums[N] = {1,2,3,4,5};
}
};
上面的代码将编译,并将声明一个包含五个int
的本地数组。