c++ 确定对象被使用前已先被初始化

1 对于内置型对象来说,应该进行手工初始化,因为c++不保证初始化他们。

2 构造函数最好使用成员初始值(member initialization list),而不是要在构造函数本体内使用赋值操作。初始列列出的成员变量,

   其排列次序应该是和它们在class中的生命次序相同。

class aaa

{

public:

  int a; 

  float b;

  std::string c;

  aaa(int a1, float b1, const std::string& name);

  ...

};

aaa::aaa(int a1, float b1, const std::string& name ):a(a1), b(b1), c(name){} // 应该用用成员初始值初始化,效率高, 对于c来说只是调用了一次copy 构造函数

aaa::aaa(int a1, float b1,const std::string& name) // 不要用这种在构造函数内赋值的方法

{

  a = a1;

  b = b1;

  c = name; // 对于c来说,先调用了一次default的构造函数(完全浪费了),然后再调用一次copy assignment来赋值。

}

 

3 为免除“跨编译单元之初始化次序”问题,请以local static 对象替换non-local static 对象

    对于不是在函数内定义的non-local static对象来说,c++对于“不同编译单元内”的non-local static 对象的初始化并没有定义。

所以如果某个non-local static对象A的初始化动作使用了另一个编译单元内的某个non-local static对象,则它使用到的这个对象可能尚未被初始化。

解决的方法就是用local static来进行替换。因为c++保证:对于函数内的local static对象会在“该函数被调用期间” “首次遇上该对象之定义式”时被

初始化。

 

example 1: 使用non-local static对象

 

/// File1

class FileSystem

{

public:

  ...

  std::size_t numDisks() const;

  ...

};

extern FileSystem tfs;

 

/// File2

class Directory

{

public:

  Directory(params);

  ...

};

Directory::Directory(params)

{

  ...

  std::size_t disks = tfs.numDisks(); // 使用tfs对象。假如tfs还没有被初始化,那么这里就会出错。

  ...

}

 

example 2: 使用local static 对象来代替 

 

/// File1

class FileSystem {...}; // 同上

FileSystem& tfs()

{

  static FileSystem tfs;

  return tfs;

}

 

/// File2

class Directory{...}; // 同上

Directory::Directory(params)

{

  ...

  std::size_t disks = tfs().numDisks(); // 使用tfs() ,这样就可以保证在使用tfs前其已经初始化

  ...

}

 

转载于:https://www.cnblogs.com/opkyo/p/7272445.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值