《Effective C++》条款20:pass-by-reference-to-const替换pass-by-value
本章之前在C++primer上看到过,N年前的东西,但是一直不太清楚,并且终于发现了以前自己没太注意的一个点。。。
本章节主要涉及const引用、普通引用、值传递三方面的内容;
英文称之为:pass-by-reference-to-const\pass-by-reference\pass-by-value;
使用pass-by-reference-to-const的几个优点:
1.避免拷贝:
其实这是普通引用和const引用的优点;
当使用pass-by-value进行传递时,其实算是拷贝传递,这时会调用构造函数;
而离开函数作用域时必定也会使用析构函数;
当类成员过多的情况下,会导致大量的时间开销,所以pass-by-value并不算一个特别好的解决办法;
2.可以对于多态有很大的帮助:
这一条是pass-by-reference和pass-by-value所不可比拟的优点;
当我们使用多态继承链时,对于类外函数进行传递,往往无法获得具体的子类信息,而采用基类形参进行传递;
但是如果使用上述两种方式,会导致无法调用多态函数,只能调用基类函数,从而使得多态失效;
所以在继承链中最好是用pass-by-reference-to-const来进行传递;
3.可以传递右值:
老生常谈的性质,之前刷题传参用过多次,只有这种方式可以使得函数实参为右值,而非必定左值;
补充的问题:
之前遗漏的点需要补充一下:
1.关于const引用是否可变的问题:
主意,const引用得到的变量为const变量,无法在函数内修改,以前刷题没注意,都不知道怎么整的。。。这次专门做了实验才发现;
2.关于for/auto的问题:
这里注意下,for(auto:)这种形式相当于默认拷贝,在循环内赋值并不改变其左值,如果想改变必须要改为for(auto&:)形式;