您的位置:首页 > Web前端

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声明)- 一般而言,吞掉异常不好,它压制了某些动作失败的重要信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: