zoukankan      html  css  js  c++  java
  • Effective C++:条款22:将成员变量声明为private

    (一)为什么不採用public成员变量

    (1)首先,语法一致性考虑,客户唯一能訪问对象的方法就是通过成员函数,客户不必考虑是否该记住使用小括号()。

    (2)其次,使用函数能够让我们对成员变量的处理有更精确的控制。假设我们令成员变量为public,那么每一个人都能够读写它。

    但假设我们以函数取得或设定其值。我们就能够实现出“不准訪问”、“仅仅读訪问”以及“读写訪问”。我们甚至能够实现“惟写訪问”。

    class AccessLevels { 
    public: 
    	//成员noAccess无不论什么訪问动作,实现不准訪问!
        int getReadOnlay() const {return readOnly;}   //对这个数据成员设置为仅仅读訪问!       
        void setReadWrite(int value){readWrite = value;}   //这个函数设置该数据成员可写訪问。
        int getReadWrite()const {return readWrite;}       //这个函数设置该数据成员可读訪问!

    void setWriteOnly(int value){writeOnly = value;} //这个函数设置该数据成员惟写訪问! private: int noAccess; int readOnly; int readWrite; int writeOnly; };

    像这样细微地划分訪问控制颇有必要。由于很多成员变量应该被隐藏起来。每一个成员变量都须要一个getter函数和setter函数毕竟罕见。

    (3)最后。还有封装性

    假设通过函数訪问成员变量。日后可改以某个计算替换这个成员变量,客户不会知道class内部实现已经起了变化。

    成员变量隐藏在函数接口的背后,能够为“全部可能的实现”提供弹性。比如这可使得成员变量被读或被写时轻松通知其它对象、能够验证class的约束条件及函数的前提和事后状态、能够在多线程环境中运行同步控制。

    。等等。

    封装性很重要。假设对客户隐藏成员变量(也就是)封装。保留了日后变更实现的权力。public意味着不封装,不封装意味着不可改变。


    (二)

    protected成员变量就像public成员变量一样缺乏封装性:成员变量的封装性与“成员变量的内容改变时所破坏的代码数量”成反比,假设一个public成员变量。我们取消了它。全部使用它的客户码都会被破坏,那是一个不可知的大量。

    所以public成员函数全然没有封装性。如果一个protected成员变量,我们取消了它。全部使用它的derived classes都会被破坏。往往也是一个不可知的大量。



    请记住:

    (1)切记将成员变量声明为private。

    这可赋予客户訪问数据的一致性。可细微划分訪问控制,允诺约束条件获得保证,并提供class作者以充分的实现弹性。
    (2)protected并不比public更具封装性。



  • 相关阅读:
    LA3523 二分图和点双连通分量的综合性质及证明
    LA4127计算几何+离散化+点覆盖
    LA 4728凸包算法-旋转卡壳的直径
    UVA 11168凸包+距离公式
    UVA 10652凸包+面的旋转
    UVA10969计算几何+交叉圆形成的圆弧长
    LA3485二分+求解积分方程+辛普森算法计算积分
    LA5009三分法
    UVA10341幂函数零点的通解分析
    UVA11524构造系数数组+高斯消元解异或方程组
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7260358.html
Copyright © 2011-2022 走看看