条款20:宁以pass-by-reference-to-const替换pass-by-value
传递引用比起传递值的参数有一个明显的优势就是,传递引用并不会构造新的对象,从而避免了构造函数和析构函数的开销,提升函数效率。
传引用参数的时候,如果使用const引用,可以告诉接下来要使用函数的人,这个数据在函数中不会被改变。
pass-by-value还会造成对象切割的问题,下面一段代码
#include<iostream> #include<cstring> #include<cstring> using namespace std; class base{ public: virtual void print()const{ cout<<"I'm base class"; } }; class dev:public base{ public: void print()const{ cout<<"I'm dev class"; } }; void fun(const base a){ a.print(); } int main(){ dev d; fun(d); return 0; }
上面这段代码的结果是I'm base class。也就是说,无论传进来的是基类还是子类,通过传值产生的对象都会被看作一个基类对象。其子类对象所拓展的部分都会被丢弃。
解决对象切割问题的方法就是用传引用来代替传参
void fun(const base& a){ a.print(); }
对于一些比较小的内置类型对象(int bool char)传递值可能会比传递引用更快。因为从原理上说,pass by reference其实还是传递的地址也就是指针,而那些类型不见得比指针更大。同时对于stl迭代器,传值也比传引用更快
对于复杂类型,还是建议使用传递引用,即使这个类看似很小。因为谁都无法保证这个类是永远不会改变的,如果对这个类进行扩充,仍然可能会使其变得很庞大。