Effective cpp 读书笔记5
2016-05-18 14:20
309 查看
设计与声明(下)
22.将成员变量声明为private
切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件或的保证,并提供class作者以充分的实现弹性protected并不比public更具封装性
某些东西的封装性与“当其内容改变时可能造成的代码破坏量”成反比
public和protected其实差不多,当成员变量是两者之一时,取消该变量,都会导致大量代码的破坏
从封装的角度看,其实只有两种访问权限:private和public
23.宁以non-member、non-friend替换member函数
这样做可以增加封装性、包裹弹性和技能扩充性封装的意义:越少代码可以访问它,越多数据可被封装,也就越能自由地改变数据
衡量封装程度:计算能够访问该数据的函数数量,作为一种粗糙的测量。越多函数可以访问它,封装性越低
能访问private数据的,只有member函数、friend函数,因此为了提高封装性,采用non-member、non-friend函数
一般实现的时候,将相关的non-member函数放在和class相同的namespace里面。将功能相似的类放在多个头文件,同一个namespace里面,从而允许客户只对它们所用的那一小部分系统形成编译依赖
24.若所有参数皆需类型转换,请为此采用non-member函数
目的是为了保证函数一致性。典型例子是重载类的运算符operator*,如果是member函数,则运算符不支持交换律,影响使用。从封装的角度看,friend和member函数一样,无论何时,如果可以避免使用friend函数就应该避免
25.考虑写出一个不抛出异常的swap函数
当std::swap对你的类型效率不高,则提供一个swap函数,并确定它不抛出异常如果你提供一个member swap,也该提供一个non-member swap来调用前者。对于自定义的class,需要特化std::swap
调用swap应该针对std::swap使用using声明,然后调用swap并且不带任何命名空间资格修饰
为用户定义类型进行std Template全特化是好的,但不要在std中加入新东西
swap是异常安全性编程的脊柱
标准库的swap只是简单的调用了复制构造函数、赋值函数;对于资源型的情况存在问题
全特化是指对模板的所有参数都特化,偏特化是对模板的部分参数特化
C++只允许对class Template偏特化,在function tempate身上不允许偏特化
重载function template可行,但是std是一个特殊的命名空间,客户可以全特化std内的模板,但不能添加新的Template到std。因此重载swap函数需要在自己的命名空间内(解释最后一条)
C++编译器对于同名的模板函数的查找顺序:编译时确定调用的模版的实参类型T,如果对应命名空间有模板专属的函数,则使用对应的;没有的话,看函数内是否有声明其他命名空间中的对应(模板)函数,有则调用(解释using声明)- 一般而言,吞掉异常不好,它压制了某些动作失败的重要信息
相关文章推荐
- illegal attempt to dereference collection
- 前端学习
- 剑指offer-第十题方法总结
- 你是什么样的前端coder?
- HTML img.src图片不存在,则显示另一张图片
- CSS3实现半像素边框
- jquery使用类似于java的集合
- [转载]React.js 2016 最佳实践
- React和Redux的连接react-redux
- 自定义标题时you can not combine custom title with other title features
- [repost]State of the Art JavaScript in 2016
- webpack配置浅析
- 前端常用知识链接地址
- 自动提取HTML中的JS进行合并与压缩
- js判断undefined类型
- ssh框架与json的整合,没导入相应jar包报的错误提示
- html常用标签
- css优先级
- NodeJs处理post请求
- Qt自定义样式/无边框窗口/子窗口模态/非模态问题