Effective C++ 条款18、19

条款18 让接口容易被正确使用,不易被误用

i、从客户角度出发考虑可能发生什么样的错误

一个用来表现日期的class设计构造函数:

class Date {
public:
	Date(int month, int day, int year);
};
Date d(30, 3, 1995);//完蛋,月份没有30的哈

一旦正确的类型就定位,限制其值有时候是通情达理的,以下比较安全的解法是预先定义所有有效的Months:

class Month {
public:
	static Month Jan() { return Month(1); }
	...
		static Month Dec() { return Month(12) };
private:
	explicit Month(int m);
	...
};
//Day与Year同样定义
Date d(Mar(), Day(30), Year(1995));//此接口就规范好多了

ii、限制类型内什么事情可做,什么事情不能做

if(a*b=c)//实际想比较的是a*b==c
//想在编译阶段就阻止此错误的办法
const type& operator*(){}//通过关键字const限制即可

iii、提供行为一致的接口,避免无端与内置类型不兼容。

例如STL容器的接口十分一致,每个STL容器都有一个名为size的成员函数。

iv、任何接口如果要求客户必须记住做某些事情,就是有着“不正确使用”的倾向,因为客户可能会忘记做那件事。

于是为了避免资源泄漏,我们引入了auto_ptr和shared_ptr指针。

shared_ptr有一个特别好的性质(支持定制删除器)是:它会自动使用它的“每个指针专属的删除器”,因而消除另一个潜在的客户错误:所谓的“cross-DLL problem”。可防范DLL问题,可被用来自动解除互斥锁(见条款14)等

条款19 设计class犹如设计type

设计高效规范的classes,必须了解面对的问题:

1、新type的对象应该如何被创建和销毁?

2、对象的初始化和对象的赋值有什么样的差别?

3、新type的对象如果被pass by value(以值传递),意味着什么?

4、什么时新type的“合法值”?

5、新type需要配合某个继承图系吗?(class特别容易受到函数是virtual或non-virtual的影响,如果允许其他classes继承,影响所所明的函数——尤其是析构函数——是否为virtual)

6、新type需要什么样的转换?

7、什么样的操作符和函数对此新type而言是合理的?

8、什么样的标准函数应该驳回?(该拒绝被访问时就放入到private内或=delete;)

9、谁该取用新type的成员?(决定哪一个是public、protected、private)

10、什么是新的“未声时接口”?

11、新type有多么一般化?(如果是定义一整个types家族,此时就应该定义一个新的class template,泛型思想)

12、真的需要一个新type吗?(或许单纯定义一个或多个non-mentber函数或templates)

以上内容均来自Scott Meyers大师所著Effective C++ version3,如有错误地方,欢迎指正!相互学习,促进!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值