首页 > 其他 > 详细

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

时间:2015-09-15 02:05:27      阅读:208      评论:0      收藏:0      [点我收藏+]

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

? ??

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

? ??

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

原文:http://bbezxcy.iteye.com/blog/2243360

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!