Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300831
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 202
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-08 20:07
文章分类

全部博文(94)

文章存档

2017年(19)

2016年(30)

2015年(12)

2014年(33)

我的朋友

分类: LINUX

2017-05-08 15:49:14

1. 构造函数内成员变量初始化顺序
C++中创建一个新的类对象时,新对象的成员变量初始化顺序只与成员变量的定义顺序有关,与成员变量初始化列表顺序无关。
例如:

点击(此处)折叠或打开

  1. class ABEntry {
  2. public:
  3.     ABEntry():b(1), c(2), a(b) {}

  4. private:
  5.     int a;
  6.     int b;
  7.     int c;
  8. };

构造函数初始化顺序为a->b->c, 所以新对象成员变量a的值是不确定的,b = 1, c = 2.

2. 解决 “跨编译单元之初始化” 问题,以local static对象替换non-local static对象。

点击(此处)折叠或打开

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

  7. extern FileSystem tfs;
若全局变量tfs在未完成构造初始化之前被其他地方使用,可能导致灾难后果。例如:

点击(此处)折叠或打开

  1. class Directory {
  2. public:
  3.     Directory(params);
  4.     ...
  5. };

  6. Directory::Directory()
  7. {
  8.     ...
  9.     std:size_t disks = tfs.numDisks();
  10.     ...
  11. }
创建一个Directory对象,用来防止临时的文件:
Directory tempDir(params);
除非tfs在tempDir之前先被初始化,否则tempDir的构造函数会用到尚未初始化的tfs。

但tfs和tempDir是不同的人在不同的时间于不同的源码文件建立起来的,他们是定义于不同编译单元内的non-local static对象。如何确定tfs会在tempDir之前先被初始化?

消除该问题的做法是:将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static)。
C++保证,函数内的local static对象会在函数被调用期间,首次遇上该对象定义式时被初始化。

点击(此处)折叠或打开

  1. class FileSystem { ... } //同前
  2. FileSystem &tfs()
  3. {
  4.     static FileSystem fs;
  5.     return fs;
  6. }

  7. class Directory { ... }

  8. Directory::Directory(params)
  9. {
  10.     ...
  11.     std::size_t disks = tfs().numDisks();
  12.     ...
  13. }

  14. Directory &tempDir()
  15. {
  16.     static Directory td;
  17.     return td;
  18. }

该类函数需注意在多线程环境下使用,static成员在多线程环境下具有不确定性。
阅读(1202) | 评论(0) | 转发(0) |
0

上一篇:c++ 迭代器

下一篇:C++不使用copy构造函数

给主人留下些什么吧!~~