- 尽量以pass-by-reference-to-const替换pass-by-value。前者往往比较高效,并可避免切割问题。
- 以上规则并不适用于内置类型,以及STL迭代器的和函数对象。对它们而言,pass-by-value往往比较适当。
PS:当面对STL迭代器和函数对象时,我们有责任看看它们是否高效且不受切割问题影响。
pass-by-value对比pass-by-reference:
class A:{
public:
A();
virtual ~A();//条款7
...
private:
string a1;
string a2;
};
class B:public A{
public:
B();
~B();
...
private:
string b1;
string b2;
};
bool fun(B b);//pass by value 方式
bool fun(const B& b);//pass by reference 方式
//调用
B b;
bool is = fun(b);
分析:
pass by value:总体成本是6次构造和6次析构。
pass by reference to const:没有任何构造或析构调用。
by reference 的const很重要,表明不希望传入的b被修改,而by-value方式,b一定不会被修改,fun只能对其副本做修改。
切割问题:
b会被构造成A对象,任何B的特有化信息都会被切除。
//pass by value
void display(A a);
B b;
display(b);