为什么这个变量需要是静态的?

时间:2014-09-04 08:02:27

标签: c++ arrays static member

class armon
{
    static const int maxSize=10;    

    int array[maxSize];

    int count=0;

    int* topOfStack=array;
}

为什么maxSize需要static才能在数组中使用?

3 个答案:

答案 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,您需要知道它的大小。
  • 要了解其大小,您需要知道各个成员的大小。在您的特定情况下,您需要知道数组的大小。
  • 为了知道数组的大小,您需要知道因变量maxSize的值。
  • 要访问因变量maxSize,您需要实例化类armon
  • 要实例化您的班级armon,您需要知道它的大小。

因此,您的数组大小因变量应该是一个常量表达式,在您的特定情况下应该是一个静态变量,

答案 2 :(得分:1)

它不必是静态的,它必须是恒定的。

当你在一个类中声明一个常量时,你将为该类的每个实例创建一个常量

此外,如果您的maxSize只是const,则必须在构造函数初始值设定项列表中对其进行初始化,因为const maxSize被视为其值无法更改的变量。

课程内const 关键字表示“这是在此对象的孔寿命期间的常量”。 同一类的不同对象可以具有该常量的不同值。

但是当它是一个静态常量时,所有类的实例都会有只有一个常量。这意味着您必须在定义它的同一行初始化常量值。