zoukankan      html  css  js  c++  java
  • 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对象
  • 相关阅读:
    oauth2-server-php for windows 的那些坑 (研究中...)
    你使用 Web 平台安装程序命令行工具
    Window 下安装 Redis
    windows下安装redis 以及phpredis的扩展 (windows redis php&php7)
    windows下redis的安装配置和php扩展使用phpredis
    常用网络端口
    PHP OAuth 2.0 Server
    Database Setup
    php各版本下载
    纯 html 以及 js 多域名跳转
  • 原文地址:https://www.cnblogs.com/qbits/p/11055349.html
Copyright © 2011-2022 走看看