zoukankan      html  css  js  c++  java
  • Effective C++ 小笔记:条款1825(第四章 设计与声明)

    条款20:宁以pass-by-reference-to-const 替换 pass-by-value

      一般而言,pass-by-value 需要耗费调用拷贝构造函数和析构函数的代价。当返回值以value返回时也同样。

      以by reference 方式传递参数还可以避免slicing(对象切割问题)。当一个derived class 对象以by value方式传递给一个函数类型为base class的形参,base class 构造函数会被调用,则造成derived对象被切割为base对象。 

      一般而言,可以合理假设“pass-by-value” 代价并不昂贵的唯一对象就是内置类型和STL的迭代器、以及函数对象。后两者都是在指针的基础上塑造出来。其他情况,尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题。

    条款21:必须返回对象时,别妄想返回其reference 

      比如operator*操作符,不能妄想返回reference,应当返回一个以值返回的对象。

      绝不要返回pointer或reference指向一个local stack对象(它们会指向或引用一个已经被销毁的对象),或返回reference指向一个heap-allocated对象(无法delete掉这个对象了)。

    条款22:将成员变量声明为private

      "封装性” 要求这样做:如果你通过函数访问成员变量,日后可以更改这个成员函数的实现,而class客户一点也不知道 class 内部实现已经变化。

      public 的成员变量意味着不封装,而几乎可以说,不封装就意味着不可改变,个别是对被广泛使用的class而言。被广泛使用的class是最需要封装的,因为它们最能够从”改变采用一个较佳的实现版本“中获益。

      protected成员变量的封装性并不高于public,这令人惊讶。成员变量的封装性与 "成员变量的内容改变时所破坏的代码数量” 成反比。所谓改变,也许是从claas中移除它。移除public的成员变量,可以破坏不可预知量的客户代码。移除protected成员变量,可以破坏使用它的所有derived class客户代码,数量依然不可预知的大。因此,protect成员变量就像public一样,缺乏封装性。

       一旦你将一个成员变量声明为public或protected而客户开始使用它,你就很难改变哪个成员变量所涉及的一切。从封装的角度看,其实只有两种访问权限:private(提供封装)和非private(不提供封装)。

      小记:切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制(只读、只写、读写、不可访问等)、允诺约束条件获得保证,并提供class作者以充分的实现方法弹性。另外,protect并不比public更具封装性。 

  • 相关阅读:
    Sql学习第二天——SQL DML与CTE解释
    Sql学习第一天——SQL UNION 和 UNION ALL 操作符(1)
    Sql学习第一天——SQL 练习题(3)
    Sql学习第一天——SQL 将变量定义为Table类型(2)
    C#性能优化实践(摘抄)
    SQL数据纵横列查询
    「SHOI2006」有色图
    SP419/422 TRANSP(2) Transposing is Fun
    ARC084F XorShift
    洛谷 P4708 画画(无标号欧拉子图计数)
  • 原文地址:https://www.cnblogs.com/younes/p/1682860.html
Copyright © 2011-2022 走看看