C++类中的数据成员能否在定义类的时候就初始化?

时间:2023-01-20 20:01:29
class A{


private:

        int a=1;


};


即上述关于类的定义正确与否?
一般而言,类中的数据成员在定义类的时候是不能初始化的。
这是一个可以值得探讨的话题,每个人的解释都不一样,大部分人都认为这是编译语法的规定,那么有没有考虑为什么会有这个规定呢?
        个人认为可能的原因有:
         (1)类只是一个抽象类型,并不是实体的东西,利用这个抽象类型会实例化成不同的个体,每个个体的特征(数据成员)都不一样,如果在类定义中将特征初始化了,岂不是破坏了抽象性,做了一个面向都一样的模子?
          (2)类的定义实际相当与类型声明,并没有分配存储空间,初始化的数据哪里放? 类实例化以后才会有实体存储地址及空间。


所以:
  1、一般的数据成员可以在构造函数中初始化。(构造初始化列表初始化和构造函数体内赋值初始化)
  2、const数据成员必须在构造函数的初始化列表中初始化(道理很简单,const成员第一次数据初始化就是发生在类构造数据初始化时,一旦过了此时就会出现问题)。
  3、static要在类的定义外面初始化。   
  4、数组成员是不能在初始化列表里初始化的,不能给数组指定明显的初始化。 


——————————————————————————————————————————————————


   然而在C++11标准允许在类定义时初始化数据成员,在新标准下,文章开头的代码与下面的代码是等价的:
class A{

public:

    A()
    {
        a=1;
    }
private:
     int a;
};


这样来定义默认构造函数似乎更为方便简洁。