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

    1、一定要手工初始化内置型non-member对象

    对于下面一条语句

    1 int x;

     如果不对x初始化,则x值是一个半随机数。

    2、使用initialization lists来初始化对象的所有成分

      为什么不能用赋值代替初始化列表?

      c++规定:对象成员变量的初始化动作发生在进入构造函数本体之前。所以,不采用初始化列表而采用赋值语句,会先调用每个数据成员的默认构造函数,然后在函数体内赋初始值,之前调用的默认构造函数就浪费了。采用初始化列表,只在初始化列表中调用数据成员的拷贝构造函数。

    3、不同编译单元内定义的non-local static对象的初始化次序

    先介绍一下什么是non-local static对象

    static对象有六种:global对象,定义于n桉树内amespace作用域内的对象,在class内声明为static的对象,在函数内声明为static的对象,在file作用域内声明为static的对象。其中在函数内声明为static的对象又被称为local static对象,而其他五种被称为non-local static对象。

    在介绍一下什么是编译单位

    产生单一目标文件的那些源码被称为编译单位,基本上包括单一源码文件加上其所包含的头文件。

    问题:有两个编译单位,那个单位中声明了一个non-local static对象,其中一个non-local static对象的初始化使用了另一个non-local static对象。代码如下

     编译单元1

    1 class FileSystem {
    2 public:
    3     ...
    4     std::size_t numDisks() const;
    5     ...
    6 };
    7 extern FileSystem tfs;

    编译单元2

     1 class Directory {
     2 public:
     3     ...
     4     Directory(params);
     5     ...
     6 };
     7 Directory::Directory(params) {
     8     ...
     9     std::size_t disks = rtfs.numDisks();    //使用编译单元1中的non-local static对象
    10     ...
    11 }

    若编译单元2构造了一个non-local static对象

    1 Directory temper(params);

    在创建Directory对象时,并不能保证tfs已经初始化

    解决方法

    将non-local static对象写进一个自己专属的函数内,该对象在函数内声明为static,函数返回一个reference指向该对象,这样non-local static对象就被变为local对象。

    c++保证:函数内的local static对象会在该函数调用期间首次遇见该对象的定义式子时被初始化。

    编译单元1

    1 class FileSystem {...}       //同前
    2 FileSystem &tfs() {
    3     static FileSystem fs;    //创建local static 对象
    4     return fs;               //返回该对象的引用
    5 }

    编译单元2

     1 class Directory{...}    //同前
     2 Directory::Directory(params) {
     3     ...
     4     std::size_t disks = tfs().numDisks();
     5     ...
     6 }
     7 Directory &tempDir() {
     8     static Directory td;
     9     return td;
    10 }

     

  • 相关阅读:
    Windows ETW 学习与使用三
    暗云Ⅳ对SATA磁盘MBR Hook探索
    msahci代码调试备份
    mimikatz使用命令记录
    Windows ETW 学习与使用一
    RabbitMQ 实现延迟队列
    Redis 脱坑指南
    浅析 ThreadLocal
    IDEA2020.2.3破解
    用友NC 模块 简写(瞎猜的)
  • 原文地址:https://www.cnblogs.com/swenwen/p/12535249.html
Copyright © 2011-2022 走看看