类成员快速初始化
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 static
和static 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
-
结论:
-
在类内部就地初始化和初始化列表并不冲突(程序可以正常运行)。程序员可以为同一成员变量既在类内部就地初始化,又在初始化列表中进行初始化,只不过初始化列表总是看起来后作用于非静态成员。也就是说,
通过初始化列表指定的值会覆盖就地初始化时指定的值
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏