条款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更加适当。

posted @ 2012-11-15 22:40  loveyakamoz  阅读(672)  评论(0编辑  收藏  举报