• EffectiveC++条款04:确定对象被使用前已先被初始化


    不要混淆赋值初始化,对于大多数类型而言,比起先调用默认构造函数然后调用赋值操作符,只调用一次拷贝构造函数是高效的
    对于内置类型,也需要成员初值列(member initialization list)来初始化,对于const和reference,则是必须的

    基类先于子类先初始化,class的成员变量初始化的顺序是以其声明的次序被初始化

    不同编译单元内定义的non-local static对象

    static对象包括global对象,定义于namespace,class,函数以及file作用域被声明为static对象
    函数内的static对象称为local static对象,其他称为non-static对象,程序结束时,static对象被销毁,也就是它们的析构函数会在main()结束时被调用
    C++不同编译单元内定义的non-local static对象的初始化相对次序并无明确定义

    可以在设计上消除这个问题:将每个non-local static对象搬到自己的专属函数内(该对象在函数内被声明为static),然后函数返回其引用,non-local static对象便被local static对象替换了,这是Singleton模式常用的手法

    任何non-const static对象,不论它是否是local还是non-local,在多线程下等待某事发生都会发生麻烦,处理这种麻烦的一种做法是在程序的单线程启动阶段,就手工调用所有reference-returning函数,可消除与初始化有关的竞态(race conditions)

    请记住

    • 为内置类型对象进行手工初始化,C++不保证初始化它们
    • 构造函数最好使用成员初值列,成员变量的排列次序应该与其在class中的声明顺序相同
    • 为免除"跨编译单元的初始化次序"问题,请以local static对象替代non-local static对象
  • 相关阅读:
    总结与学习DIV+CSS网页布局技巧
    sns.pairplot()
    使用python处理Excel,Excel中一行数据生产一个Excel文件
    sklearn.model_selection
    sklearn.datasets
    sklearn.metrics 模型评估指标
    LightGBM
    对比Node.js和Python 帮你确定理想编程解决方案!
    小白需要了解的Ajax和websocket的区别以及使用场景!
    为什么越来越多的人想学编程?
  • 原文地址:https://www.cnblogs.com/qbits/p/11055349.html
Copyright © 2020-2023  润新知