(一)为什么不採用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更具封装性。

Effective C++:条款22:将成员变量声明为private的更多相关文章

  1. Effective C++ -----条款22:将成员变量声明为private

    切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. protected并不比public更具有封装性.

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

    protected成员变量的封装性并非高于public变量. 如果有个public的成员变量,一旦其需要改变,那么所有使用它的代码都需要改变. 如果有个protected的成员变量,一点其需要改变,那 ...

  3. 条款22:将成员变量声明为private(Declare data members private)

    NOTE: 1.切记将成员变量声明为private.这可赋予客户访问数据的一致性 可细微划分访问控制 允诺约束条件获得保证,并提供class作者以充分的实现弹性. 2.protected 并不比pub ...

  4. 【22】将成员变量声明为private

    1.为什么要将成员变量声明为private,语法一致性,只通过方法暴露接口. 2.使用方法,可以对成员变量更精确的控制.比如:为所有可能的实现提供弹性,不同实现可以替换:控制可读可写:验证约束条件:处 ...

  5. [Effective C++ --022]将成员变量声明为private

    这一章并没有什么太多的内容,作者无非想告诉我们一件事:成员变量应该是private. 为此,他列举了以下的理由: 1.成员函数来返回成员变量是非常高效: 2.protected成员变量并不比publi ...

  6. 读书笔记_Effective_C++_条款二十二:将成员变量声明为private

    1.格式统一 在调用的时候,不会去想有没有(),一律是有get(),或者set()之类的. 2.封装 能直接访问得越少,表明封装性越高, 封装性越高,我们的顾虑就少了, 例如:我们a.data*0.9 ...

  7. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  8. 【C++】const,static和static const类型成员变量声明及其初始化

    1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...

  9. C++11类内static成员变量声明与定义

    众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...

随机推荐

  1. POJ 1113 Wall(凸包)

    [题目链接] http://poj.org/problem?id=1113 [题目大意] 给出一个城堡,要求求出距城堡距离大于L的地方建围墙将城堡围起来求所要围墙的长度 [题解] 画图易得答案为凸包的 ...

  2. [CF414E]Mashmokh's Designed Problem

    题意:给一棵树,有三个操作:①询问两点$(x,y)$之间的距离②把$x$和原来的父亲断开并连到它的$h$级祖先,作为新父亲最右的儿子③询问与根节点距离为$k$的点中最右的点是哪个点 用出栈入栈序$s_ ...

  3. 友情链接&部分题目的密码

    YPL: https://www.cnblogs.com/Sdchr/ ZWL: https://www.cnblogs.com/acha XJ: https://blog.csdn.net/boyx ...

  4. 如何判断一个请求是不是ajax请求

    原文:http://blog.csdn.net/easy_is_good/article/details/53609057 public boolean isAjaxRequest(HttpServl ...

  5. Coherence装载数据的研究-PreloadRequest

    最近给客户准备培训,看到Coherence可以通过三种方式批量加载数据,分别是: Custom application InvocableMap - PreloadRequest Invocation ...

  6. Oracle Service Bus Socket Adapter调整的参数

    之前在一个客户中做压力测试时候Oracle Service Bus性能大概达到900tps左右,和客户期望的1600tps有很大差距. 在研究了Socket Adapter的工作原理之后,判断可能是O ...

  7. Go测试,功能测试,性能测试,测试辅助,go test 工具,高级测试,IO相关测试,黑盒测试,HTTP测试,进程测试

    go命令教程: http://wiki.jikexueyuan.com/project/go-command-tutorial/0.5.html Go测试 第一个测试 “Hello Test!” 首先 ...

  8. nagios监控mongodb

    nagios本身不提供监控mongodb的服务,需要安装插件 已经有大神写好的插件nagios_plugin-mongodb 地址https://github.com/mzupan/nagios-pl ...

  9. 奇怪也哉!做一个WebApp居然遇到了FF浏览器进不去某页的问题。

    一个小WebApp,原定login完后就进某页面.前天晚上之前一直在FF浏览器上调试,都正常. 前天晚上稍修改了,提交war上传,之后就休息了. 昨天晚上有些事情处理打开一看,乖乖,点登录后就在登陆页 ...

  10. Java 多线程之 synchronized 和 volatile 的比較

    概述 在做多线程并发处理时,常常须要对资源进行可见性訪问和相互排斥同步操作.有时候,我们可能从前辈那里得知我们须要对资源进行 volatile 或是 synchronized 关键字修饰处理.但是,我 ...