条款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迭代器,传值也比传引用更快
? ??
? ? 对于复杂类型,还是建议使用传递引用,即使这个类看似很小。因为谁都无法保证这个类是永远不会改变的,如果对这个类进行扩充,仍然可能会使其变得很庞大。
? ??
原文:http://bbezxcy.iteye.com/blog/2243360