《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;
}

 

这章需要重新看,个人感觉多文件和联合编译仍然有不少问题;

 

posted @ 2020-12-08 11:23  暮云林凌  阅读(102)  评论(0)    收藏  举报