《Effective C++》条款18:关于接口的规范和误用问题
本章节主要讲述了关于接口的使用问题,也就是如何设计一个被正确使用,而不是被误用的接口;
文中主要针对以下点做了阐述:
1.注意类型系统错误:例如传参中传入的类型和所需要的类型并不符;
2.限制类型内操作:防止因为用户的操作来进行未定义的操作;
3.避免忘记一些操作:经典的shared_ptr指针的问题;
注意类型系统错误:
文中论述的主要还是传参的问题,用户可能不知晓或者没注意参数列表和值限定的范围,很容易的传入不符合标准的值;
因此,需要进行一些限定和检查工作,避免传入参数有问题;
对于文中给出的方式,最典型的是直接把不同的参数化为类,来通过编译器检查参数错误;
即如果发生传参失误,必定是类类型不匹配;
其中值得注意的是,对于一些确定的类型个数,可以直接采用non-static静态函数返回对象来进行使用,其中涉及到了条款4的调用链问题https://www.cnblogs.com/songlinxuan/p/14076516.html;
class Month {
public:
static Month Jan() {
return Month(1);
}
static Month Feb() {
return Month(2);
}
private:
explicit Month(int m);
};
如上所示,通过调用:
Date d(Month::Jan());
可以直接返回一个Month对象;
限制用户未定义的操作:
比如之前条款3曾经说的https://www.cnblogs.com/songlinxuan/p/14075426.htmlif((a*b)=c)问题,如果不加限定会导致一些经典的错误问题;
避免忘记一些操作:
文中举例比较典型的是还是shared_ptr的问题,把用户想象成了一个蠢比;
例如典型的
Investment* createInvestment(),如果用户忘了Investment*包装成shared_ptr,则会出现问题;
所以可以返回一个shared_ptr来防止用户忘记;
并且也提到了一个小tip,可以先初始化,再指定删除器;
shared_ptr<Investment> createInvestment() {
shared_ptr<Investment> reVal(static_cast<Investment*>(0),/*删除器*/delete_fun);
//绑定指针;
return reVal;
}
这章需要重新看,个人感觉多文件和联合编译仍然有不少问题;

浙公网安备 33010602011771号