随笔 - 51, 文章 - 1, 评论 - 41, 引用 - 0
数据加载中……

CPPEXP —— 类成员初始化顺序

说明

C++类成员初始化顺序取决于其声明顺序,而非初始化列表的顺序。

测试代码

  1. /**
  2. * 测试类成员的初始化顺序
  3. * @file init_oder.cpp
  4. */
  5. #include <iostream>
  6. class Test {
  7. public:
  8. Test() : mBb(sIndex++), mAa(sIndex++) { }
  9. public:
  10. void Dump() {
  11. std::cout<< "a: " << mAa << ", b: " << mBb << std::endl;
  12. }
  13. protected:
  14. int mAa;
  15. int mBb;
  16. static int sIndex;
  17. };
  18. int Test::sIndex = 1;
  19. int main() {
  20. Test t;
  21. t.Dump();
  22. return 0;
  23. }

运行及结果

$ g++ init_order.cpp
$ ./a.out
a: 1, b: 2

风险分析

当类的成员初始化有依赖关系(如某个成员的构造函数的参数是另一个成员)时,较容易出错。这是因为程序员的意图(初始化列表顺序)和程序的行为(成员声明 顺序)是分离的,前者一般位于实现文件,后者位于头文件,编辑前者往往忽略后者。因此少用有依赖的初始化设计,并且在review中加入该检查条目。





posted on 2016-04-17 12:43 lemene 阅读(94) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理