先上结论

使用初始化列表主要基于性能问题。

  • 对于内置类型,初始化列表与构造函数几乎无差异
  • 对于类类型(特别是复杂类型),由于使用初始化列表少调用了一次默认构造函数的过程,对数据密集型的类来说,是非常高效的!。

    代码实例

    针对于类类型,来证明【初始化列表少调用了一次默认构造函数】

  1. #include <iostream>
  2. using namespace std;
  3. class AA
  4. {
  5. public:
  6. AA()
  7. {
  8. std::cout << "AA: default constructor" << std::endl;
  9. }
  10. AA(const AA&)
  11. {
  12. std::cout << "AA: copy constructor" << std::endl;
  13. }
  14. AA& operator=(const AA&)
  15. {
  16. std::cout << "AA: assign constructor" << std::endl;
  17. return *this;
  18. }
  19. ~AA()
  20. {
  21. std::cout << "AA: destructor" << std::endl;
  22. }
  23. };
  24. class BB
  25. {
  26. public:
  27. BB(AA& _a)
  28. #ifdef INITIAL
  29. :a(_a)
  30. {
  31. #else
  32. {
  33. a = _a;
  34. #endif
  35. std::cout << "BB: default constructor" << std::endl;
  36. }
  37. ~BB()
  38. {
  39. std::cout << "BB: destructor" << std::endl;
  40. }
  41. private:
  42. AA a;
  43. };
  44. int main() {
  45. AA a;
  46. std::cout << "--------------------------" << std::endl;
  47. BB b(a);
  48. std::cout << "--------------------------" << std::endl;
  49. return 0;
  50. }

执行结果分析(仅如下两行代码修改)

  • 编译命令:g++ .\initial.cpp -o init

image.png

  • 编译命令:g++ -DINITIAL .\initial.cpp -o init

image.png
由两个图对比可知:
通过初始化构造【类对象】,可以减少1次构造函数