我一直在尝试使用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
答案 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 ++不允许数组大小的非常量值。这就是它的设计方式。必须在编译时确定数组的大小。
如果你想要一个动态大小的数组,你需要为它分配内存(当你完成时用删除释放它)。