Effective C++第三版之(四)Designs and Declarations

Designs and Declarations设计与声明

软件设计,即令软件按一定的步骤完成各种操作。

条款18:Make interfaces easy to use correctly and hard to use incorrectly.让接口正确使用而不易被误用。
1,在function接口、class接口、template接口中导入新类型,在新类型中规范行为及封装数据,可预防接口被误用的错误。
1)限制类型内什么可做、什么不可做,常见的限制是加上const。
2)尽量令新类型行为与内置类型一致,例STL容器都有size的成员函数,表示容器内对象数量。
2,当接口返回动态分配对象,可能导致对象未被删除或多次删除,可将接口设计为返回智能指针,引用计数为0时自动释放内存。
1)如果管理对象不是由delete释放内存时,可指定智能指针管理对象的删除器。
2)智能指针还可消除潜在的corss-DLL problem,对象在动态链接程序库DLL中由new创建,却在另一个DLL内由delete销毁,这类跨DLL的new/delete成对使用在部分编绎器下可能会导致运行期错误,智能指针有专属删除器则不会导致此错误。
3)智能指针可消除接口误用错误,但其使用成本高于一般指针,动态分配内存,专属删除器,以及多线程使用中引用计数的同步等额外开销,比原始指针大且慢,需要根据实际情况选择使用。
3,总结:阻止接口误用的办法包括建立新类型、限制类型上的操作、限制对象值,以及管理资源。

条款19:Treat class design as type design.设计class犹如设计type
1,C++面向对象特性,设计class即定义新的type。需要重载函数和运算符、控制内存的分配和释放、定义对象的初始化和终结。
1)type对象的创建和销毁,考虑class构造函数和析构函数的设计,控制内存分配和释放。
2)对象的初始化和赋值,考虑构造函数和赋值运算符的设计及差异。
3)type对象的passed by value,copy构造函数如何实现type的passed by value。
4)维护type内成员变量合法值集,成员函数内变量类型检查,适时抛出异常。
5)维护type的继承图系,基类virtual函数和non-virtual函数影响,以及作为基类的影响例析构函数是否为virtual。
6)type的类型转换,隐式类型转换以及显式类型转换,并注意二义性转换问题。
7)与type匹配的运算符和成员函数设计。
8)type内显示禁止不想使用的编绎器自动生成函数,声明为private但不定义。
9)type成员的访问控制和友元管理,成员是public或private或protected,friend的classes和functions。
10)type的未声明接口,异常安全的保证,见条款29。
11)type泛化,如果定义的是整个types,则需要定义的是class template。
12)type的必要性,是否能以derived class取代。

条款20:Prefer pass-by-reference-to-const to pass-by-value.以pass-by-reference-to-const替代pass-by-value.
1,缺省情况下C++以by value方式传递参数,参数以实参的副本初始化,副本则由copy构造函数产生,函数调用中存在对象copy构造函数的调用,以及调用结束后对象析构函数的调用。以pass-by-reference-to-const代替参数传递可避免构造和析构的动作,无新对象的创建,不可对传入参数作任何改变。
2,以by reference方式传递参数还可实现class的多态,derived class对象绑定在base class引用上实现多态功能;derived class对象以by value初始化base class对象,调用的是base class的copy构造函数,创建的是base class对象。
3,对象为内置类型时,pass by value更高效,STL迭代器和函数对象也是如此。

条款21:Don’t try to return a reference when you must return an object.当必须返回对象时,不要返回其reference
1,必须返回对象的函数可让函数返回一个新对象。
1)不返回pointer或reference指向一个local stack对象。
2)不返回reference指向一个heap-allocated对象。
3)不返回pointer或reference指向一个local static对象。

条款22:Declare data members private.将成员变量声明为private
1,通过成员函数访问成员变量,更精确的控制成员变量,可以实现不准访问、只读访问、只写访问、读写访问等,并且利于class的封装,内部成员变量有变化时,外部调用不需要跟着变动。
2,将成员变量隐藏在函数接口背后,可以验证class的约束条件以及函数的前提和事后状态、可以在多线程环境中执行同步控制等。
3,从封装角度来看,建议声明成员变量为private。
1)public成员变量意味着不封装,当成员变量有变动时将影响所有类外直接使用该成员变量的代码。
2)封装成protected的变量有变动时,所有使用的derived classes会被破坏。

条款23:Prefer non-member non-friend functions to member functions.以non-member、non-friend替换member函数
1,member函数和non-member、non-friend函数,提供相同的功能,选择non-member、non-friend函数。
1)数据应该尽可能的封装,non-member函数相对member函数封装性更高,因member函数可访问class内private成员。
2)封装性更强,类内变动影响就会很有限,可扩展性更强,编绎依赖度也低。
2,non-member、member对于编绎器来说都是non-member方法,编绎器会将member方法绑定的对象转化为non-member的第一个形参。
3,将non-member、non-friend方法与类声明在同一个命名空间内,类不能跨越多个源文件但命名空间可以。
4,当前class的non-member函数可以是另一个class的member函数。

条款24:Declare non-member functions when type conversions should apply to all parameters.若所有参数需要类型转换,采用non-member函数
1,算术计算中,参数为int/long/float/double需要类型转换,或复合运算符重载需要为this指针指向的隐藏参数进行类型转换的,采用non-member函数。
2,member函数的反面是non-member,不是friend,可以避免friend函数的尽量避免。
3,当从Object-Oriented C++跨到Template C++时,不适用此条款,参见条款46。

条款25:Consider support for a non-throwing swap.写出不抛出异常的swap函数
1,swap原本是STL的内容,需要注意处理自赋值的可能,swap置换两对象值,缺省情况下可由标准库swap算法完成,只要对象T支持copying(copy构造函数和copy assignment运算符)。
2,标准库为所有容器提供public swap成员函数和std::swap,后者调用前者。
3,通常情况下不允许修改std命名空间内容,但可以为标准模板增加特例化版本,标准库允许对模板类和模板函数全特化,只允许对类模板偏特化, 同时不允许增加新的模板类和模板函数以及其他内容到std中。
4,如果标准库swap不满足需求或效率较低,在设计模板或类时:
1)实现public swap成员函数高效的置换两个对象值,且不抛出异常。
2)在class或template所在命名空间内实现一个non-member swap并调用上述swap成员函数。
3)在class(非 class template)内,特例化标准库swap,令它调用swap成员函数。
5,成员swap不可抛出异常,自定义swap提供高效置换对象值时一般是基于内置类型的操作,内置类型的操作上绝不会抛出异常。
6,非成员swap版本可抛出异常,因swap缺省是以copy构造函数和copy assignment运算符完成操作,而copy构造函数和copy assignment运算符是允许抛出异常的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值