《Effective C艹》读书笔记(13)

条款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迭代器,传值也比传引用更快

    

    对于复杂类型,还是建议使用传递引用,即使这个类看似很小。因为谁都无法保证这个类是永远不会改变的,如果对这个类进行扩充,仍然可能会使其变得很庞大。

    

猜你喜欢

转载自bbezxcy.iteye.com/blog/2243360
今日推荐