Effective C++读书笔记(13)

本文探讨了C++中的class设计准则,并深入讨论了如何通过引用传递常量来提高效率,避免对象切割问题,以及函数对象的优势。

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

class的设计规范:1、新type的对象应该如何被创建和销毁?2、对象的初始化和对象的赋值该有什么样的区别?3、新type的对象如果被passed by value,意味着什么?(copy构造函数)4、什么是新type的“合法值”?5、你的新type需要配合某个继承图系么?6、你的新type需要什么样的转换?7、什么样的操作符和函数对此新type而言是合理的?8、什么样的标准函数应该驳回?9、谁该取用新type的成员?10、什么是新type的“未声明接口”?11、你的新type有多么一般化?12、你真的需要一个新type么?

条款20:宁以pass-by-reference-to-const替换pass-by-value

缺省情况下c++以by value方式传递对象至函数,它们都是以实际实参的复件为初值,由对象的copy构造函数产出。(参数传递成本是一次copy构造函数和一次析构函数)

应采用pass by reference to const,原因如下:1、这种传递方式的效率高很多:没有任何构造函数或析构函数调用,将其设为const保护实参对象的值不被改变。2、可以避免slicing(对象切割)问题。当一个derived class对象以by value方式传递并被视为一个base class对象时,base class的copy构造函数被调用,而造成仅留下base class对象,而以pass by reference to const传递时,传进来的实参是什么类型就表现什么类型。

pass by reference往往是传递的对象的指针。因此,如果形参是内置类型,STL的迭代器或函数对象时仍采用pass by value更高效,因为习惯上它们都被设计为passed by value,而程序员有责任看看它们是否高效且不受切割问题的影响。

一般而言,你可以合理假设“pass-by-value并不昂贵”的唯一对象就是内置类型、STL的迭代器和函数对象。至于其他任何东西都尽量用pass by reference to const 代替 pass by value。

函数对象:是重载了“()”操作符的普通类对象。

class Add
{
public:
  int operator()(int a, int b)
  {
    return a + b;
  }
};


用函数对象代替函数指针有以下几个优点:1、因为对象可以在内部修改而不用改变外部接口,因此设计更加灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。2、在函数对象中编译器能实现内联调用。3、函数对象还可以应用模版。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值