Effective C++读书笔记(13)

来源:互联网 发布:屏幕放大镜软件 编辑:程序博客网 时间:2024/06/05 18:51

条款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、函数对象还可以应用模版。

0 0
原创粉丝点击