[英]Const and Static declared in a Class, C++
我知道该类是一个描述,因此我们无法在其中定义const。 但是我发现这让我感到困惑,首先:
class A
{
private:
const int Months=12;// Fails
};
我不知道我是否对,如果我认为A的对象可能很多,那么会有很多const Month。 因此,C ++禁止这样做。
但第二:
class A
{
private:
static int Montshs =12;//Fails,
};
我也知道Months可以在A类之外进行初始化; 我认为这是一个描述,因此我们不能在A类中使用static进行初始化(我不知道我是否正确),
但继续:
class A
{
private:
static const int Montshs =12;//ok,
};
可以,我不能给自己任何理由。 有人能告诉我原因吗?
有没有人可以给我关于这三个问题的详细解释? 我认为也许是关于记忆的安排。
1: const int Months=12;
这在C ++ 03中是不允许的,但自C ++ 11起是允许的。 原因正好是您所描述的:可能有许多A实例,因此这不是一个单一值,而必须写入A类的任何对象中。在C ++ 11中,此表示法用于给该非静态成员a默认值。 在C ++ 03中,您必须记住要在每个构造函数中初始化成员。
2: static int Months =12;
这仍然是一个变量 ,必须在单个翻译单元中定义。 因此,在单个X.cpp 中 ,必须有一行int A::Months = 42;
。 这样,变量将获得您使用其初始化的值(在这种情况下为42),从而使您在声明(12)中给出的值几乎没有用。
3: static const int Montshs =12;
这是一个特例,因为它是一个编译时常量 。 它是一个值,不绑定到任何类型为A
单个对象,并且不可更改。 因此,编译器可以从查看标头中的定义中受益,因为它可以优化对符号的所有错误,基本上在看到A::Months
任何地方都使用值12。 它基本上不需要为其分配存储,因为它可以在任何需要的地方将值12写入代码中。 这也不总是可能的,某些较早的编译器不会接受。 然后,您将不得不使用enum-Trick: enum { Months = 12 };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.