条款4 确定对象被使用前已先被初始化
条款4 确定对象被使用前已先被初始化
C++中class的初始化动作发生在进入构造函数本体前。构造函数内的是赋值,而不是初始化。最好使用成员处置列(member initialization list)
例如:
class A{
public:
A(int num):x(num){}; //这是初始化,而构造函数本体不需要做任何动作
private:
int x;
};
不同变异单元内定义之non-local static对象的初始化次序
C++对于不同编译单元内的non-local static对象的初始化次序并没有明确定义
因为决定它们的初始化次序很难,最常见形式是多个编译单元内的non-local static 对象 经由“模板隐式具现化”形成
解决方法:
将每个non-local static 对象搬到自己的专属函数内(该对象在函数内被声明为static),返回一个reference指向所含对象.用户调用函数,而不直接指对象。
就是non-local对象被 local static对象替换了,这是Singleton模式的常见实现手法
优势:C++保证,函数内的local static对象会在“该函数被调用期间”“首次遇上该对象定义式”时被初始化。如果从未调用这个对象“仿真函数”,就不会引发构造和析构成本
总之
- 为内置型对象进行手工初始化,C++并不保证初始化它们
- 构造函数最好用成员初值列,而不是构造函数内赋值。初值列的成员变量排列次序应该与在class声明次序相同
- 为避免“跨编译单元之初始化次序”问题,以local static替换non-local static对象。
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16091472.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理