【问题标题】:Using a const inside of a class - static vs not static在类中使用 const - 静态与非静态
【发布时间】:2015-11-18 03:05:09
【问题描述】:

我一直在尝试使用 const 作为类声明中数组的大小。我知道如果我使用静态常量,它会起作用,但我很难理解为什么。更具体地说,为什么我可以对类中的某些数据成员使用 const,而对其他数据成员必须指定静态 const,如下所示:

class Test
{
public:
   static const int size = 10;   // 1. Works. Must be static to use it as size of array
   const int alpha = 20; // 2. Works, but cannot use as size of an array
   const double beta = 10.0; // 3. Works
   static const double gamma = 20.0; // 4. does not compile

   int table[size];  // Works with size, but not alpha
};

我已经阅读了很多解释,但还没有找到一个(或至少一个我理解的)专门针对案例 1 与案例 4 的不同之处,以及为什么我需要为数组设置 const 静态。

有人能解释一下吗?

编辑:我正在使用 VS 2013,如果这有影响的话

【问题讨论】:

  • 数组的大小必须在编译时确定,因此必须在数组声明中使用静态值。
  • 在使用 a const int would work 的类之外,但在类主体中,它并不是真正的 const,因为您在构造函数中对其进行了初始化,因此值可以与 size 不同。
  • 案例 4 使用double。数组大小必须是整数。不过,一个 2.5 元素的数组会很有趣。就像平均有 2.5 个孩子的家庭一样。
  • 除了愚蠢的cmets,这是一个有趣的。我不知道为什么static const int 有效但static const double 无效。可能需要等待语言律师办理入住。
  • @Shafik 这是正确的答案,但他的 OP 可能需要解释为什么以这种方式初始化的非静态变量在编译时实际上不是 const。

标签: c++ arrays constants


【解决方案1】:

不同的是:

const int alpha = 20;

指定20默认值,如果您不指定任何其他值,对象的alpha 将获得该值。然而,该类可以很容易地拥有一个覆盖它的构造函数,例如:

// header file:
struct S
{
    S();
    S(int);
    const int alpha = 20;
};

// .cpp file
S::S(int): alpha(30) { }
S::S(): alpha(40) {}

所以alpha 的值实际上对于不同的对象可能是不同的。这意味着对象的大小不能依赖于它,因为相同类型的所有对象必须具有相同的大小和布局。

但是,在static const int size = 10; 的情况下,这在当时和那里指定size 确实具有10 的价值,并且以后没有任何东西可以取代它;所以这可以用作数组大小等等。只有一个 size 变量独立于类的任何对象。

【讨论】:

  • 这是解释为什么 int 必须是静态的好方法!但是为什么双精度也不能是静态的呢?
【解决方案2】:

但还没有找到一个(或至少我理解的一个)专门用于使案例 1 与案例 4 不同的原因,

数组大小只能是整数表达式,可以在编译时计算。由于gamma 属于double 类型,因此不能将其用作数组的大小。

为什么我需要将数组的 const 设为静态。

static 成员仅作为类对象的成员存在。如果没有类的对象,它的值是不可用的。这引发了一个catch-22的情况。你不能定义没有大小的类。没有对象就无法获得大小。 static 成员解决了这个问题。

【讨论】:

    【解决方案3】:

    C++ 不允许数组大小使用非常量值。这就是它的设计方式。数组的大小必须在编译时确定。

    如果你想要一个动态大小的数组,你需要为它分配内存(完成后用 delete 释放它)。

    【讨论】:

    • size 是允许的常量表达式。在类主体之外使用 const int 也可以。
    • 请阅读答案。你说的和我说的一样……请在否决之前重新阅读我的回答……
    • 他是对的:这个答案无法解释static的必要性。
    猜你喜欢
    • 2012-04-13
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2017-06-22
    • 2020-07-04
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多