Effective C++读书笔记(五)——设计与声明

目录

 

1.让接口容易被正确使用,不易被误用

2. 设计class犹如设计type

3.宁以pass-by-reference-to -const替换pass-by-value


1.让接口容易被正确使用,不易被误用

class Date
{
public:
     Date(int month, int day, int year)
     ...
};

上述接口可能会引起客户调用的错误,即填写顺序出错:
Date d(2, 30, 2020);
Date d(30, 2, 2020);

进一步,可以将month,day,year封装成struct或class

struct Day
{
   explicit Day(int d)
	       :val(d)
			{}
   int val;
};

struct Month
{
   explicit Month(int d)
	       :val(d)
			{}
   int val;
};

struct Year
{
   explicit Year(int d)
	       :val(d)
			{}
   int val;
};

class Date
{
public:
     Date(const Month& m, const Day& d,const Year& y)
     ...
};

这样调用的时候会直接报类型不匹配:
Date m_date(Month(12),Day(20),Year(2020));//正确
Date m_date1(Day(20),Month(12),Year(2020));//错误
//error: no matching function for call to ‘Date::Date(Day, Month, Year)’
但是构造函数内仍需要做Day、Month和Year之间的关系以及大小限制。

STL容器的接口十分一致,size函数对各个容器都适用,不像Java中数组适用length,Lists使用size。

2. 设计class犹如设计type

3.宁以pass-by-reference-to -const替换pass-by-value

优点:

  1. 避免额外的构造和析构函数带来的消耗,因此比较高效。
  2. 以by-reference方式传递参数可以避免slicing(对象切割)问题。

注意事项:

以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value 往往比较恰当。

1.bool validateStudent(Student s);
bool platoIsOK = validateStudent(plato);

上述过程:Student的copy构造函数被调用,以plato为蓝本初始化s。当validateStudent函数返回时,s会被销毁。因此,对此函数而言,参数的传递成本是“一次Student copy构造函数被调用 ,加上一次Student析构函数调用”。当Student类中存在多个成员变量的时候,构造和析构的次数会成倍增加。

采用bool validateStudent(const Student& s) 效率会高很多,因为没有任何新对象被创建,所以没有任何构造函数和析构函数被调用。

————————————————————————————————————————————————————————————————
2.当一个derived class 对象以by value方式传递并视为一个base class对象, base class的copy构造函数会被调用,而“造成此对象的行为像个derived class对象”的那些特化性质全被切割,仅仅留下一个base class对象。

void printNameAndDisplay(Window w)

void printNameAndDisplay(const Window& w)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值