600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 条款20 :宁以pass-by-reference-to-const 替换pass-by-value

条款20 :宁以pass-by-reference-to-const 替换pass-by-value

时间:2023-10-06 01:56:51

相关推荐

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。