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更具封装性。
Effective C++:条款22:将成员变量声明为private的更多相关文章
- Effective C++ -----条款22:将成员变量声明为private
切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. protected并不比public更具有封装性.
- 条款22:将成员变量声明为private
protected成员变量的封装性并非高于public变量. 如果有个public的成员变量,一旦其需要改变,那么所有使用它的代码都需要改变. 如果有个protected的成员变量,一点其需要改变,那 ...
- 条款22:将成员变量声明为private(Declare data members private)
NOTE: 1.切记将成员变量声明为private.这可赋予客户访问数据的一致性 可细微划分访问控制 允诺约束条件获得保证,并提供class作者以充分的实现弹性. 2.protected 并不比pub ...
- 【22】将成员变量声明为private
1.为什么要将成员变量声明为private,语法一致性,只通过方法暴露接口. 2.使用方法,可以对成员变量更精确的控制.比如:为所有可能的实现提供弹性,不同实现可以替换:控制可读可写:验证约束条件:处 ...
- [Effective C++ --022]将成员变量声明为private
这一章并没有什么太多的内容,作者无非想告诉我们一件事:成员变量应该是private. 为此,他列举了以下的理由: 1.成员函数来返回成员变量是非常高效: 2.protected成员变量并不比publi ...
- 读书笔记_Effective_C++_条款二十二:将成员变量声明为private
1.格式统一 在调用的时候,不会去想有没有(),一律是有get(),或者set()之类的. 2.封装 能直接访问得越少,表明封装性越高, 封装性越高,我们的顾虑就少了, 例如:我们a.data*0.9 ...
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- C++11类内static成员变量声明与定义
众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...
随机推荐
- java中的3大特性之继承
继承的特点:继承父类的属性和方法.单继承(多层继承)c++里的继承是多继承 特性 :方法的复写(重写) java中的继承和OC中一样. 比如:人可以养狗; 人---->狗 :整体和部分(拥有)关 ...
- 【计算几何】【极角序】【二分】bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形
极角排序后枚举每个点,计算其与原点连线的左侧的半平面内的点与其组成的三角形数(二分/尺取),这些都不是黄金三角形. 补集转化,用平面内所有三角形的个数(C(n,3))减去这些即可. 精度很宽松,几乎不 ...
- python基础之二
1. 数据类型 1.1 数字 数字的作用:与数字相关,例如:手机号.QQ号.身份证号等,用数字表示 数字分为:整数(int).浮点数(float).复数(了解) 例子: age = 10 print( ...
- Shell中 调用/引用/包含 另外的脚本文件的两种方法
脚本 first (测试示例1) #!/bin/bash echo 'your are in first file' 问)在当前脚本文件中调用另外一个脚本文件? 方法一: 使用 source 脚本 s ...
- HOW TO CHECK FOR ACTIVE TRACE FLAGS ON MICROSOFT SQL SERVER
http://crashmag.net/how-to-check-for-active-trace-flags-on-microsoft-sql-server You check for active ...
- Cesium 事件
1.相机事件(移动开始.移动结束等等) viewer.scene.camera.moveEnd.addEventListener(function(){ }): 2.鼠标事件(单击.移动.右键等) v ...
- Python开发网络爬虫抓取某同城房价信息
前言: 苦逼的我从某某城市换到另一个稍微大点的某某城市,面临的第一个问题就是买房,奋斗10多年,又回到起点,废话就不多说了,看看如何设计程序把某同城上的房价数据抓取过来. 方案:方案思路很简单,先把网 ...
- Swift,初始化
1.class中的值是没办法不赋值,不然会报错,那么就有个init的方法初始化(这个方法使得实例时必须加上参数) class test{ var a:String var b:Int init(a:S ...
- npm使用常见问题及注意事项
1.npm.cnpm.yarn不要混用,一个项目只使用一个 2.NPM problem: npm ERR! extraneous 表明安装了很多不需要的三方包 使用命令 npm prune删除无用的包 ...
- 13:在O(1)时间删除单链表节点
题目:给定单项链表的头指针和一个节点指针.定义一个函数在O(1)时间删除该节点. 解析: 删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才干实现.而这样做的时间复杂度是O(n).无 ...