zoukankan      html  css  js  c++  java
  • 条款4:确定对象在被使用前已经被初始化

    需要注意三点:

    1.手工初始化内置型的非成员对象

    2.使用初始化成员列表对付对象的所有成员

    3.对"初始化顺序不确实"的问题要注意自己的设计.

    这里重点介绍下第三种的情况:

    下面的tfs会在外部文件b.cpp中使用,但是当前这种写法不能够保证tfs在b.cpp中使用时已经被初始化了,这样就会造成问题.

     1 //a.h
     2 class FileSystem
     3 {
     4 public:
     5     int numDisk() const;
     6 };
     7 
     8 extern FileSystem fs;    //只是声明
     9 
    10 //a.cpp
    11 FileSystem fs;    //这里是定义
    12 
    13 
    14 ///b.cpp
    15 class Directory
    16 {
    17 public:
    18     Directory(string params)
    19     {
    20         int disks = fs.numDisks();    //因为a.cpp和b.cpp在编译时并不能保证先后顺序,有可能出现tfs还没有被初始化,就被使用的情况
    21     }
    22 };

    把tfs声明为一个函数,返回对象的引用,这样b.cpp中去调用时,就能够保证fs一定是初始化了的.不过这里我有个疑问,作者为什么要用静态变量的引用呢?不可以是局部变量吗?或者不使用引用吗?

     1 //a.h
     2 class FileSystem    //库中定义的类
     3 {
     4 public:
     5     int numDisks() const;
     6 };
     7 
     8 //a.cpp
     9 FileSystem &tfs()//这样写,表示tfs()是一个全局函数,而非成员函数.
    10 {
    11     static FileSystem fs;    //C++保证函数中的local static对象会在"该函数被调用期间""首次遇上该对象的定义式"时被初始化.
    12     return fs;
    13 }
    14 
    15 //b.cpp
    16 class Directory
    17 {
    18 public:
    19     Directory(string params)
    20     {
    21         int  disks = tfs().numDisks();    
    22     }
    23 };
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    第九次作业
    第八次作业
    第七次作业
    组合数学—递推关系与母函数
    组合数学—排列组合
    三角函数
    OpenCV初步
    计算机视觉如何入门
    GDB调试技巧:总结篇
    PyQt5之窗口类型
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/12081549.html
Copyright © 2011-2022 走看看