繁体   English   中英

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

[英]Why does this variable need to be static?

class armon
{
    static const int maxSize=10;    

    int array[maxSize];

    int count=0;

    int* topOfStack=array;
}

为什么要在数组内部使用maxSize ,它必须是static的?

不必是静态的,但它必须是一个常量表达式

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的求值将对以下表达式之一求值:

(5.1.1),但作为e的一部分评估的constexpr函数或constexpr构造函数除外;

size的评估实际上是this->size

这个问题有两个方面

方面1

C ++数组的大小固定,需要在编译时知道其大小。 如果需要在运行时推迟决策,则数组表达式格式错误。

方面2

将成员变量声明为非静态变量使其成为实例变量,实例变量的值仅在实例化对象(在运行时完成)后才存在。 静态变量是类变量,其值可以在编译时确定。

您的特定示例成为经典的鸡蛋悖论。

class armon
{
    static const int maxSize=10;    

    int array[maxSize];

}
  • 为了实例化您的class armon ,您需要知道其大小。
  • 为了知道其大小,您需要知道单个成员的大小。 在您的特定情况下,您需要知道数组的大小。
  • 为了知道数组的大小,您需要知道因变量maxSize的值。
  • 为了访问因变量maxSize,您需要实例化armon类。
  • 为了实例化您的class armon ,您需要知道其大小。

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

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

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

另外,如果maxSize只是const ,则必须在构造函数初始化器列表中对其进行初始化,因为const maxSize被视为变量,您不能更改其值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM