Note of Justin

关于工作和读书的笔记

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(1)

搜索

  •  

积分与排名

  • 积分 - 44902
  • 排名 - 409

最新评论

阅读排行榜

评论排行榜

[原创文章欢迎转载,但请保留作者信息]

Justin 于 2009-10-26

这里要讲的是饭前要洗手。

如果手没洗干净就开动,你可能会因为吃下脏东西而腹泻不止;如果对象没初始化就使用,程序可能会由于未知的初值参与运算而痛苦不堪。

道理很简单。怎么洗呢:

  • 对于内建的对象类型(例子?int),一定要亲自初始化他们,因为有时候C++不会帮你干这种没有技术含量的活@#¥%
  • 对于对象自身的成员,推荐的方法是在构造函数的初始化列表来干这个活。
    注意,如果只是简单的在构造函数里将变量一一赋值,那只是“赋值”,不是“初始化”。前者的效率要比后者低,因为前者先构造了对象再对他们赋值,而后者一石二鸟,毕其功于一役,在构造的同时就也把值赋了(多好的孩子!)。这里还没加上拷贝构造函数的可能开销,还有一些类型如const变量、引用(reference)是不能用赋值的形式“初始化”的……
    下面就有两个程序片段的例子对比(最恨贴代码的了,没有一点技术含量)
    //initialize by assignment
    ClassA::ClassA (int i, const std::string& s, const ClassC& c)
    {
       iInt 
    = i;
       sStr 
    = s;
       cClassC 
    = c;
    }

    // initialize by initialization list
    ClassB::ClassB ( int  i,  const  std:: string &  s,  const  ClassC &  c)
       : iInt(i),
         sStr(s),
         cClassC(c)
    {}
  • 如果在初始化某个对象的时候,有对其他对象是否有初始化的依赖(对不起,这里有点拗口),一定要确保其中所依赖的对象已经初始化完毕。通篇几乎都在说没有什么技术含量,最后逼得大师给了一点有技术含量的内容:
    当不同的对象的初始化存在相互依赖时,某个对象没有初始化有可能导致另外一个对象初始化的失败。
    比如说,呃……我又要比如说了,吃饭前要保证做饭的自来水是干净的,也要保证抓饭的手(哪国的?)也是干净的。要保证手是干净的就要洗手,洗手的前提是自来水是干净的。这个时候手和自来水是否干净这两个前提之间就有了依赖关系。
    当初始化涉及到非局部静态对象(non-local static object)时,问题更加明显:非局部静态对象如果定义在不同的文件中,他们就有可能位于不同的编译单元(translation unit),因为这些对象到底谁先被初始化是不可预知的。(也就是说我们可能在洗手前并不知道水是不是已经弄干净了)

    解决此类问题的一个方法是:把非局部静态对象转换为局部静态对象(local static object),也就是把它的定义放在一个函数里。然后紧接着在这个函数返回该对象的引用。C++语言规定在调用一个含有局部静态对象的函数时,其中的所有局部静态对象都必须初始化。这个方法就是利用这一特性,将原本对一个非局部静态对象的访问,转换为对一个函数的调用,这个函数会返回该静态对象的引用,并且保证这个对象已经被初始化了。
    就比如说如果我们需要保证洗手的时候水已经是干净的了,就在水龙头外加一个净水器,这样只要一开水就一定是干净的了,哇哈哈。(如果看到这里还不明白,就去看书上的例子吧,我自己也承认这一部分被我解读得很晦涩@#¥%)

    试图亡羊补牢,总结一下上面两坨字:如果需要初始化一个非局部静态对象,就把它放到一个函数里,让这个函数简单的返回这个对象的引用。(为什么要这样做?你可以返回看上面两坨字……)

 

posted on 2009-12-15 21:37 Justin.H 阅读(324) 评论(2)  编辑 收藏 引用 所属分类: Effective C++ 炒冷饭

Feedback

# re: Effective C++ 炒冷饭– Item 4 对象的初始化 2009-12-16 00:16 陈梓瀚(vczh)
发布的时候有一个选项可以放到首页的。  回复  更多评论
  

# re: Effective C++ 炒冷饭– Item 4 对象的初始化 2009-12-16 10:09 Justin.H
多谢提醒:)  回复  更多评论
  


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