人生美好
继续接上篇文章https://blog.csdn.net/weixin_37997214/article/details/106629880
目录
第三章 资源管理
条款13-17涉及到智能指针,了解就可以,使用C++11时会单独讲解。
其中有一条现在就能用到的一条。
char *p = new char[20];//申请一个char型数组指针
delete []p; //释放的时候要加[]告诉程序释放的是一个指向数组的指针
注意:不是指向数组的是不能用delete []的。
第四章 设计与声明
条款18:让接口容易被正确使用,不易被误用。
1.假设你写了如下接口:
void setDate(int year, int month ,int date); //设置日期
这看起来没毛病,但是,该接口被调用的时候可能会出错。如下面几种形式:
setDate(3,30,2020); //错误:没有按照顺序插入数据。
setDate(2020,13,30); //错误:月份超过13月
setDate(2020,2,30); //错误:2月份没有30号
解决该问题的方法
(1)类型系统
struct Month
{
explicit Month(int d)
:value(d)
{
}
int value;
};
函数可写成
void setDate(int year, const Month& month ,int date); //设置日期
此时调用setDate则可使用
setDate(2020,Month(3),30); //用户直接指明到底哪个参数是月,如果不是则会报错导致编译不通过
2.接口功能要符合大众口味,比如接口getDate那么就应该返回Date。类比标准类型进行自己接口的设计往往是一个好办法。
条款总结说明:
1.好的接口很容易被正确使用,(因为误用很耽误时间)。
2.促进正确使用的方法之一是往人们习惯的方向去努力。
3.阻止误用的方法包括类型系统、加const、以及delete不留给用户。
条款19:设计class犹如设计type
这章比较好,就是说明设计一个类往往需要考虑的事情。这个应该做成一个清单供设计者使用。
条款20:宁传引用不传值
本条款主要说明传参数的时候如果能设计成传引用就设计成传引用,别传值。
原因如下:
(1)传值影响程序效率。
(2)传值可能造成对象切割。如下:
classA : public classB;//A继承B
void setDate(classB tmp_class); //有如下接口,classB为参数
classA a; //A的对象a
setDate(a); //传入时,只会传入父类的属性,不会传入子类的属性(事实本来这
//里是想传子类)
void setDate(classB &b); //引用传参
setDate(a); //传的是啥参数内容就是啥
注意:传递内置类型的时候不要用引用,包括STL里面的迭代器和对象。
条款21:必须返回对象时,别妄想返回其reference
看如下代码
const classA operator* (classA &a,classA &b)
{
classA res;
res = a*b;
return &res;
}
返回引用,res在函数周期后消亡,导致返回的与预期不符。
注意,这里res换成静态的也不行,不要用这种方法,如果你想返回一个对象,那么就别想绕过这个类的构造函数。
条款22:将成员变量声明为private
保持接口一致性的一个方法是别有public的成员变量,用户每次调用成员都是调用函数,而不是调用变量。
public 的变量和函数,在程序中应该代表“永远不会改变的部分”。因为public内容的改变对于客户程序来讲往往是大量更改。程序中如果不是public的,那么就应该是private,文章中不建议使用protected。