C++博客 :: 首页 :: 联系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用链接

留言簿(48)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 393361
  • 排名 - 58

最新评论

阅读排行榜

评论排行榜

请看下面的代码:

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)
{

}

里面有个严重的错误,绝对没人会知道data里会有多少个元素。你也许认为在data之前size已经被初始化了,实则不然,类成员变量的初始化不是按照初始化表的顺序被初始化的,而是按照在类中声明的顺序被初始化的。

为什么会这样呢?我们知道,对一个对象的所有成员来说,它们的析构函数被调用的顺序总是和它们在构造函数里被创建的顺序相反。那么,如果允许上面的情况(即,成员按它们在初始化列表上出现的顺序被初始化)发生,编译器就要为每一个对象跟踪其成员初始化的顺序,以保证它们的析构函数以正确的顺序被调用。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在初始化列表中的顺序如何。

注意:上述内容不适用于static变量,static变量应该在类的构造函数前被初始化。

posted on 2008-01-22 10:46 sdfasdf 阅读(6215) 评论(1)  编辑 收藏 引用 所属分类: C++

Feedback

# re: Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同 2012-01-13 05:21 UK Proxy
谢谢  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理