类中的const变量和static变量

来源:互联网 发布:手机淘宝应用授权管理 编辑:程序博客网 时间:2024/04/27 15:46

对常量成员的初始化,你应该在类的构造函数的初始化部分初始化,而非像静态类成员那样在类声明中初始化。
像这样:
class abc
{
public:
abc();
private:
const int ab;
};
abc::abc():ab(0)//在这里初始化。
{}

但是如果 static const int ab; 就可以这样定义:const int abc::ab=0;(静态变量都这么定义的哦)

静态成员的定义是属于类的,所以紧接着类的定义的下面:int abc::a=2;

这是因为,对于静态成员来说,它是属于所有的类对象的,在内存中只存在一份拷贝,自然对于它的初始化只能进行一次,所以初始化它的方法被设计在了类声明中,而非类对象的定义中。
而常量成员呢,它是每个类对象都会拥有一份拷贝,所以它的初始化应该随着每个类对象的构造而进行一次,所有它的初始化只能存在于类的构造函数中。


转自:http://blog.163.com/redhumor@126/blog/static/19554784201031323313315/


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

为何const变量必须在初始化列表中定义,而不能在构造函数里定义?

定义时给定一个值就是初始化。定义后再给这个数一个值就是赋值,const定义的是常量,所以只能初始化。

定义是在类本身定义的时候进行的(就是你class的那个大括号里进行的),
调用构造函数的时候,首先是给该实例(类的具体对象)分配空间,
使用初始化列表的话,就在分配空间的时候,同时将其空间初始化,
但在构造函数的大括号里,所有变(常)量的空间都已经分配好了,
而常量本身是不能改变值的,这时对其调用的“=”只能是赋值,
也就是改变其现有值,当然是非法操作。


声明:    就是告诉编译器,这个变量名是有定义的(不一定在这里定义,但编译器应该能找到定义)

定义:    给一个变量分配空间的地方,根据规定,在整个编译过程里,每个变量有且仅能有一个定义(只有极少数例外)

赋值:    在变(常)量的空间被分配好了以后,再修改该空间内容的操作。

初始化:在变(常)量被定义的同时,在被分配的空间里,放入的值,这个概念对常量比较明显,因为常量只能被初始化。


const 、static、static const变量都不能再class定义时赋值!单独的const要用初始化列表初始化,static类型可以在定义外面初始化。

 class A
 {
    private:
           const int c3 = 7;               // err
           static int c4 = 7;               // err
           static const float c5 = 7;  // err
          ......
  };