条款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,如有错误地方,欢迎指正!相互学习,促进!!