看看你写的类定义是否合理?--关于部分构造的问题
以下文字摘抄自C++程序设计语言中文版P326
考虑下面的类定义:
1 class X { 2 public: 3 X( int s ) { p = new int[s]; init(); } 4 ~X() { delete[] p; } 5 6 private: 7 int* p; 8 void init(); 9 10 }
这个类定义存在的问题是:它有可能导致“存储流失”。如果init()抛出异常,那么申请到的存储就不会被释放,因为有关对象并没有构造完成,对它不会调用析构函数。一种安全的变形是
1 class Z { 2 public: 3 Z( int s ) : p(s) { init(); } 4 //... 5 6 private: 7 vector<int> p; 8 void init(); 9 }
下面再给出一些说明性的知识:
一个由子对象组成的对象的构造将一直持续到它所有的子对象都完成了构造工作。
数组的构造一直持续到它的所有元素都构造完成。
构造函数试图去保证对象能够完全、正确地创建起来。如果这个目标无法达到,那么书写良好的构造函数就应当将系统的状态(尽可能地)恢复到对象开始构造之前的情况。