在C++接口设计中,一个基本的原则是:让接口容易被正确使用,不容易被误用。接下来的所有讨论都基于这一基本原则。
宁以引用方式(pass-by-reference-to-const)替换传值方式(pass-by-value)
当使用传值方式时,实际上传递的是对象的一个副本,这样会调用其构造函数和析构函数,增加了开销,而引用方式实际上传递的是对象的地址,没有任何构造函数或析构函数被调用,而将引用声明为const,是因为不这样做会担心调用对象会改变被调用对象的值。
同时,以引用方式传递参数也可以避免slicing(对象切割)问题。所谓对象切割,是指当一个派生类对象以传值方式传递并被视为一个基类对象,基类的拷贝构造函数会被调用,造成此对象的派生类特质全部被切割,仅留下基类对象。简单点来说就是参数是基类,而当你将一个派生类对象以传值方式传入时,传递到函数内的那个副本是一个基类对象而不是派生类对象。解决此问题的方法便是以pass-by-reference-to-const的方式传递它。
但是记住,这些规则不适用于内置类型,以及stl的迭代器和函数对象,对他们用pass-by-value比较适当。
必须返回对象时,不要返回其reference
绝不要返回指针或者引用指向一个局部栈对象,或返回引用指向一个堆对象,或返回指针或引用指向一个局部静态对象而有可能同时需要多个这样的对象。
为了使我们的对象有良好的封装,我们应该尽量以非成员函数非友元函数替换成员函数,并且如果你需要对某个函数的所有参数(包括this指针所指的)进行类型转换,那么这个函数必须是非成员函数。