条款十三: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
2014-08-11 13:09
337 查看
template<class t> class array { public: array(int lowbound, int highbound); ... private: vector<t> data; // 数组数据存储在vector对象中 // 关于vector模板参见条款49 size_t size; // 数组中元素的数量 int lbound, hbound; // 下限,上限 }; template<class t> array<t>::array(int lowbound, int highbound) : size(highbound - lowbound + 1), lbound(lowbound), hbound(highbound), data(size) {}
array类实现了一个数组,该数组可以指定起始下标,而不是一定从0开始
类成员是按照它们在类里被声明的顺序进行初始化的,和它们在成员初始化列表中列出的顺序没一点关系。用上面的array模板生成的类里,data总会被首先初始化,然后是size, lbound和hbound,data中的成员个数不清楚。所以初始化列表中成员列出的顺序和它们在类中声明的顺序相同,否则可能会有部分成员没有初始化成功。
改正方法:类中声明的vector对象放到size变量后面声明
如果你深究一下的话,会发现只是非静态数据成员的初始化遵守以上规则。静态数据成员的行为有点象全局和名字空间对象,所以只会被初始化一次(详见条款47)。另外,基类数据成员总是在派生类数据成员之前被初始化,所以使用继承时,要把基类的初始化列在成员初始化列表的最前面(调用基类构造函数)。(如果使用多继承,基类被初始化的顺序和它们被派生类继承的顺序一致,它们在成员初始化列表中的顺序会被忽略。使用多继承有很多地方要考虑。条款43关于多继承应考虑哪些方面的问题提出了很多建议。)
相关文章推荐
- Effective c++ 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 条款 13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- effective C++笔记之条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 构造函数初始化列表中成员列出顺序要和它们在类中声明顺序相同
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 成员变量的初始化顺序与变量在类型中的申明顺序相同,而与它们在构造函数的初始化列表中的顺序无关
- 在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。
- 类的成员变量 声明顺序 决定 初始化顺序(构造函数初始化列表不影响)
- 在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。
- 初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的
- 初始化列表中初始化顺序和它们在类中声明的顺序保持一致---读书笔记
- 11.c++-初始化列表中初始化顺序和它们在类中声明的顺序保持一致
- 写程序说明C++中成员函数的初始化顺序只跟在类中的声明顺序有关, 而跟初始化列表中的顺序无关(笔试考过)
- C++ - 类的成员变量 声明顺序 与 初始化顺序 相同
- C++ - 类的成员变量 声明顺序 与 初始化顺序 相同