class armon
{
static const int maxSize=10;
int array[maxSize];
int count=0;
int* topOfStack=array;
}
为什么maxSize
需要static
才能在数组中使用?
答案 0 :(得分:14)
不是静态的,但它必须是常量表达式。
C ++标准§8.3.4[dcl.array](强调我的):
如果存在常量表达式(5.19),它应该是转换后的常量表达式,类型为std :: size_t ,其值应大于零
即,以下内容也有效:
constexpr std::size_t Size() { return 10; };
struct Y
{
int array[Size()];
};
注意:强>
由于编译器需要知道类的大小,所以不能这样做:
struct Y
{
const int size = 10;
int array[size];
};
可能会使Y
具有不同大小的不同实例。
另请注意,在此上下文中,int array[size]
不是常量表达式,因为它使用this
,请参阅C ++标准部分§5.19[expr.const ]:
条件表达式e是核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:
- this (5.1.1),但constexpr函数或constexpr构造函数除外,它被作为e的一部分进行评估;
(size
的评估确实是this->size
)
答案 1 :(得分:5)
这个问题有两个方面
方面1
C ++数组具有固定大小,在编译期间需要知道其大小。如果在运行时期间需要延迟决策,则数组表达式将变得格式不正确。
方面2
将成员变量声明为非静态变量使其成为实例变量,其值仅在实例化对象时才存在,该变量在运行时完成。静态变量是一个类变量,其值可以在编译期间确定。
你的特殊例子成为经典的鸡蛋悖论。
class armon
{
static const int maxSize=10;
int array[maxSize];
}
armon
,您需要知道它的大小。 armon
。armon
,您需要知道它的大小。 因此,您的数组大小因变量应该是一个常量表达式,在您的特定情况下应该是一个静态变量,
答案 2 :(得分:1)
它不必是静态的,它必须是恒定的。
当你在一个类中声明一个常量时,你将为该类的每个实例创建一个常量。
此外,如果您的maxSize
只是const
,则必须在构造函数初始值设定项列表中对其进行初始化,因为const maxSize
被视为其值无法更改的变量。
课程内const
关键字表示“这是在此对象的孔寿命期间的常量”。 同一类的不同对象可以具有该常量的不同值。
但是当它是一个静态常量时,所有类的实例都会有只有一个常量。这意味着您必须在定义它的同一行初始化常量值。