Effctive C++ 改善程序与设计的55个具体做法 (第三版) 学习笔记(四)

人生美好

继续接上篇文章https://blog.csdn.net/weixin_37997214/article/details/106629880

目录

第三章 资源管理

第四章 设计与声明

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

条款19:设计class犹如设计type

条款20:宁传引用不传值

条款21:必须返回对象时,别妄想返回其reference

条款22:将成员变量声明为private


第三章 资源管理

条款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。

如果有帮到你点个赞,欢迎在评论区讨论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值