条款20 :宁以pass-by-reference-to-const 替换pass-by-value
缺省的情况下,C++是以by value方式传递对象至函数。函数实参都是以实际实参的复件为初始值,而调用端获得的亦是函数返回值的一个复件。这些复件系由对象的copy构造函数产出,这可能使得pass by value成为昂贵的操作。
考虑下面的继承体系:
classPerson{
public:
Person();
vitual~Person();
private:
std::stringname;
std::stringaddress;
};
classStudent:publicPerson{
public:
Student();
virtual~Student();
private:
std::stringschoolName;
std::stringschoolAddress;
};
现在有一个调用函数validateStudent,要调用一个Student实参并返回它是否有效?
boolvalidateStudent(Students);
Studentplato;
boolplatoIsOK=validateStudent(plato);
当上述调用发生时,会发生什么事?我们用图来说明:
这样结束了吗?也不是这些吧。再看。
我们知道Student类继承了Person类,而且两个类中,都有string类类型的变量。My God
如果有一个方法可以回避这些所有的构造函数与析构函数,那就好了。
有的,那就是以pass by reference to const.
boolvalidateStudent(constStudent&s);
注意,采用此种方式,还在以避免对象被切割。
voidprintStudent(Personp){
cout<<schoolaName<<endl;//Error ,
}
…
Studentplato;
printStudent(plato); //本来想着要打印名字,但是由于对象被切割,会出现问题
为什么用引用了之后,可以避免被切割?
如果窥视C++底层的话,你就会发现,reference往往是以指针实现出来的。因此,传递过来的指针。
如果你的参数是一个内置类型,则采用pass by value会比pass by reference to const更加有效率一些。
请记住:
l 尽量以pass by reference to const替换pass by value。前者通常比较高效,并可避免切割的问题。
l 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass by value更加适当。