在类中使用const - 静态vs非静态

时间:2015-11-18 03:05:09

标签: c++ arrays const

我一直在尝试使用const作为类声明中数组的大小。我知道如果我使用静态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

3 个答案:

答案 0 :(得分:2)

区别在于:

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变量与该类的任何对象分开。

答案 1 :(得分:0)

  

但是没有找到一个(或至少一个我理解的)专门针对案例1与案例4的不同之处,

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

  

为什么我需要为数组创建const静态。

static成员仅作为该类对象的成员存在。没有类的对象,它的值是不可用的。这引发了一场陷入困境的局面。你不能在没有大小的情况下定义类。没有物体你就无法获得尺寸。 static成员解决了这个问题。

答案 2 :(得分:-1)

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

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