c ++中的const和static说明符

时间:2010-09-25 03:51:02

标签: c++

#include<iostream>
using namespace std;
class A
{
        private:
                const  int a=9;
        public:
                void display()
                {
                    cout<<a;
                }
};
int main()
{
        A a;
        a.display();
        return 0;
}

为什么不允许初始化const int a = 9。 但是,如果我写了常量静态int a = 9编译器没有显示任何错误。写const static int a = 9是什么意思?我什么时候写这样的? 〜

3 个答案:

答案 0 :(得分:5)

使用构造函数初始化列表初始化非静态常量成员。

ISO C ++ 03说明了有关静态数据成员的以下内容。

[class.static.data]

9.4.2 Static data members

  

1静态数据成员不是类的子对象的一部分。只有一个静态数据成员的副本由该类的所有对象共享。

     

2静态数据成员在其类定义中的声明不是定义,除了cv-qualified void之外可能是不完整的类型。 staticdata成员的定义应出现在包含成员类定义的命名空间范围内。在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定。 `

     

如果静态数据成员是 const integral 或const枚举类型,则其在类定义中的声明可以指定常量初始化器,它应该是一个整型常量表达式 (5.19)。在这种情况下,成员可以出现在整数常量表达式中。 如果在程序中使用该成员,并且命名空间范围定义不包含初始化程序* ,则该成员仍应在名称空间范围内定义。

class A
{
        private:

                const  int a=9; //incorrect 
                static const int b = 10; //declaration (correct)
                static const double c = 1.3 //incorrect (Only const-static int members can be initialized like that)


        public:

                A(): a(9){} 
};

const int A::b; //definition of const-static int member

如果(且仅限于)it has an out-of-class definition:

,您可以获取静态成员的地址
class AE {
    // ...
public:
    static const int c6 = 7;
    static const int c7 = 31;
};

const int AE::c7;   // definition

int f()
{
    const int* p1 = &AE::c6;    // error: c6 not an lvalue
    const int* p2 = &AE::c7;    // ok
    // ...
}

答案 1 :(得分:2)

要初始化const对象,您需要在构造函数中执行它,因为它是int的每个对象实例化。另一方面,static const变量的不同之处在于它在该类型的所有对象之间共享。这意味着它在数据段中分配,在对象内的变量的单独位置。它必须在构造函数之外定义,因为它只会被设置一次,而不是每个对象设置一次。

编辑:根据卡萨布兰卡的建议修复“堆叠”

答案 2 :(得分:0)

static是用于类的无实例变量/方法的关键字。因此陈述:

static int a=9;

意味着为应用程序的生命而活。 const关键字表示值无法更改。因此const static int a=9;声明一个变量,它既是静态的(为应用程序而存在),也不会改变值。

您无法陈述的原因:

const int a=9;

是因为非静态成员不能像这样初始化,需要在构造函数中初始化。由于你无法在声明之外更改常量变量,因此不可能使用常量非静态成员。

编辑:另请注意,不需要const非静态成员。因为你的成员永远不会改变价值,所以让它静态来解决错误对你的代码没有任何影响,除了你可以用A::a访问它,而不需要实例化A。