类成员快速初始化

发布时间 2023-12-04 16:59:04作者: Beasts777

文章参考:爱编程的大丙 (subingwen.cn)

1. C++98类成员初始化

C++98中的初始化策略:

  • 非静态数据成员,必须在构造函数中初始化。
  • 静态数据成员,有两种情况:
    • 在类外进行初始化。
    • 如果是静态常量,而且是整形/枚举类型,可以在类中声明时直接加上=初始值来初始化。

EG:

  • 代码:

    class Test{
    private:
        int a;
        int b = 1;							
        static int c = 0;
        static const double d = 1.1;
        static const string e = "abc";
        const static int f = 1;
    }
    
  • 编译结果如下:

    • 第四行:不是类的静态常量成员,必须在类的构造函数中进行初始化。

    • 第五行:不是类的静态常量成员,必须在类的构造函数中进行初始化。

    • 第六行:是类的静态常量成员,但不是整形或者枚举,无法通过编译。

      注意:虽然使用g++可能发现这一句可以通过编译,但这是GUN对C++的一个扩展,并不符合C++标准。

    • 第七行:是类的静态常量成员,但不是整形或者枚举,无法通过编译。

    • 第八行:编译通过。

  • 注意:const staticstatic const是等价的。

2. C++11类成员初始化

C++11保留了C++98支持的类成员初始化方式,并再次基础上添加了新的类成员初始化支持。

2.1 非静态成员初始化

C++11允许在声明时对类的非静态成员直接进行初始化,通过={}操作符进行赋值。

EG:

class Test{
private:
    int a;
    int b = 10;
    int c{1};
    string str1 = "abd";                                                                          
    string str2{"abc"};
    double arr[3] = {1.1, 2.2, 3.3};
};

2.2 类内部赋值和成员初始化列表

既然C++11中允许了非静态数据成员在声明时直接初始化,那么如果有数据成员int a,我在声明时令其=10,又在成员初始化列表中赋值为20,那么a的值是多少?也就是说:如果类内部赋值和成员初始化列表同时对一个变量进行赋值,谁的等级更高?

  • 代码:

    class Test{
    public:
        int _a = 10;
    public:
        Test(int a=0): _a(a){}
    };
    
    int main(void){
        Test test(20);
        cout << test._a << endl; 
        return 0;
    }
    
  • 输出:

    20
    
  • 结论:

  • 在类内部就地初始化和初始化列表并不冲突(程序可以正常运行)。程序员可以为同一成员变量既在类内部就地初始化,又在初始化列表中进行初始化,只不过初始化列表总是看起来后作用于非静态成员。也就是说,通过初始化列表指定的值会覆盖就地初始化时指定的值