zoukankan      html  css  js  c++  java
  • NO.4: 确定对象被使用前已被初始化

    1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始化(赋值与初始化效率持平)

    2.构造函数最好使用成员初始化列表方式,构造函数体内属于赋值操作,且初始化列表最好与声明变量次序保持一致(成员变量实际初始化次序与声明次序一致)

    3.为免除 "跨编译单元之初始化次序"问题,请以 "local-static" 对象替换 "non-local-static"(即单例模式(singleton));

    编译单元:指产出单一目标文件,包括 源码和头文件,所以这涉及2个源码文件了

    non-local-static:位于global对象,或者匿名namespace作用域,class内,file内都称为non-local-static,而函数内的称为local-static(stack/heap-based 除外);

    Total : 2个不同的编译单元内各含有自己的non-local-static变量,且其中一个static变量需要另一个static变量,它所用到的static可能未完成初始化,C++中 "不同编译单元定义的non-local-static" 初始化次序无明确定义.

    解决办法: 使用函数内local-static定义,因为C++保证函数内的"local-static"对象,会在 "该函数调用期间" “首次遇到该对象定义式” 时初始化;

    拓展:多个编译单元的 "non-local-static" 对象经由 "模板隐式具现化" 形成!

     1 //Effective C++ NO.4
     2 
     3 
     4 class Demo
     5 {
     6 public:
     7     Demo(){};
     8     
     9     Demo& SingleMode()
    10     {
    11         static Demo Demo_static;
    12         return Demo_static;
    13     }
    14 };
  • 相关阅读:
    【C语言】23typedef
    C#蓝牙开发之查找设备以及配对
    GridView获取隐藏列的值
    PDA(Windows Mobile)调用远程WebService
    VS2008使用宏记录来实现自动增加注释信息
    CS 系统框架二[部分内容更新]
    GridView里面嵌套RadioButton
    .Net 以报表的形式加载SAP里面的数据
    取GridView的PagerTemplate里面的控件ID
    《深入Ajax架构和最佳实践》读书笔记
  • 原文地址:https://www.cnblogs.com/xuaidongstdudyrecording/p/7257871.html
Copyright © 2011-2022 走看看