【读书笔记】Effective C++(05)实现

栏目: C++ · 发布时间: 4年前

内容简介:作者:LogM本文原载于

作者:LogM

本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~

5. 实现

  • 5.1 条款26:尽可能延后变量定义式出现的时间

    • std::string encryptPassword(const std::string& password) {
          using namespace std;
          string encrypted;   //bad,过早定义,如果下一句出异常,这个变量其实没有用到,导致无谓的构造和析构
          if (password.length() < MinimumPasswordLength) {
              throw logic_error("Password is too short");
          }
          ...   //加密过程
          return encrypted;
      }
      
      std::string encryptPassword(const std::string& password) {
          using namespace std;
          if (password.length() < MinimumPasswordLength) {
              throw logic_error("Password is too short");
          }
      
          string encrypted;   //ok,要用到时再定义
          ...  //加密过程
          return encrypted;
      }
    • //循环内的变量怎么定义?
      
      //方法A:定义于循环外
      Widget w;
      for (int i=0; i<n; ++i) {
          w = ...;
          ...
      }
      
      //方法B:定义于循环内
      for (int i=0; i<n; ++i) {
          Widget w(...);
          ...
      }
      
      //方法A:1个构造函数、1个析构函数、n个赋值操作,变量w作用域覆盖到循环以外
      //方法B:n个构造函数、n个析构函数,变量w作用域仅在循环内
      //具体使用哪个视情况而定。
      
      //我自己想了一个非常小众的写法,虽然可以兼得方法A和方法B的长处,但是代码可读性降低
      for (int i=0, Widget w; i<n; ++i) {
          w = ...;
          ...
      }
  • 5.2 条款27:尽量少做转型动作

    • C++的新式转型:

      const_cast<...>(...)
      dynamic_cast<...>(...)
      reinterpret_cast<...>(...)
      static_cast<...>(...)
      
    • 作者提醒,只有明确知道转型后的结果是什么时才使用转型,自以为是地猜测转型的结果往往导致错误。
  • 5.3 条款28:避免返回值是指向 private 成员变量的引用或者指针

    • 很容易理解,如果成员函数返回值是指向 private 成员变量的引用或者指针,那么成员变量的 private 不再具有意义,它实际能被修改。
    • 解决方法是将返回的引用或指针设为const类型,禁止修改。
    • 有些特殊情况下,返回的引用或指针指向的成员变量被销毁,导致引用和指针无效(dangling handles),这种情况要在代码中避免。
  • 5.4 条款29:保证"异常安全"

    • 异常安全的函数,即使在发生异常的时候也能保证不泄漏资源不破坏数据结构,可以分为三种:

      • a. 基本型:保证资源不泄露,保证数据结构不破坏,但异常发生后程序中的对象的状态是未知的;
      • b. 强烈型:在基本型的基础上,保证如果出现异常,程序中的对象的状态会回复到"调用该函数前"的状态;
      • c. 不抛异常型:承诺所有异常都能被处理,不抛出异常。
    • 实际使用时,要综合考虑效率和安全性来确定使用哪一种类型的异常安全。
  • 5.4 条款30:透彻理解inline函数

    .h
    
  • 5.5 条款31:将文件间的编译依存关系降到最低

    • 原因:当改动一个文件后,不需要整个工程都重新编译。
    • 常见的"把类的定义和声明放在两个文件中",就是减少编译依存关系的一个例子。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂的独角兽

疯狂的独角兽

丹·莱昂斯 / 王天任 / 海南出版社 / 2017-10 / 42

★商业与文学的有机结合,真实与虚幻间嬉笑怒骂,幽默风趣、引人入胜、发人深省的商业小说。 ★《纽约时报》《华尔街日报》《旧金山纪事报》Amazon畅销书,《财富》《纽约邮报》《新闻周刊》《华盛顿邮报》、畅销书《硅谷钢铁侠》作者阿什利·万斯、畅销书《一网打尽》作者布拉德·斯通联袂推荐。 ★作者丹·莱昂斯集小说家、记者、编剧为一身——HBO经典热门剧、豆瓣高分美剧《硅谷》作者;畅销书《乔布斯......一起来看看 《疯狂的独角兽》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换