条款20 :宁以pass-by-reference-to-const 替换pass-by-value
缺省的情況下,C++是以by value方式傳遞對象至函數(shù)。函數(shù)實(shí)參都是以實(shí)際實(shí)參的復(fù)件為初始值,而調(diào)用端獲得的亦是函數(shù)返回值的一個(gè)復(fù)件。這些復(fù)件系由對象的copy構(gòu)造函數(shù)產(chǎn)出,這可能使得pass by value成為昂貴的操作。
?
?????? 考慮下面的繼承體系:
?
classPerson{
public:
??? Person();
??? vitual~Person();
private:
??? std::stringname;
??? std::stringaddress;
};
?
classStudent:publicPerson{
public:
??? Student();
??? virtual~Student();
private:
??? std::stringschoolName;
??? std::stringschoolAddress;
?
};
?
?
?
現(xiàn)在有一個(gè)調(diào)用函數(shù)validateStudent,要調(diào)用一個(gè)Student實(shí)參并返回它是否有效?
boolvalidateStudent(Students);
Studentplato;
boolplatoIsOK=validateStudent(plato);
當(dāng)上述調(diào)用發(fā)生時(shí),會發(fā)生什么事?我們用圖來說明:
????????
?這樣結(jié)束了嗎?也不是這些吧。再看。
我們知道Student類繼承了Person類,而且兩個(gè)類中,都有string類類型的變量。My God
?
如果有一個(gè)方法可以回避這些所有的構(gòu)造函數(shù)與析構(gòu)函數(shù),那就好了。
有的,那就是以pass by reference to const.
boolvalidateStudent(constStudent&s);
注意,采用此種方式,還在以避免對象被切割。
voidprintStudent(Personp){
?????? cout<<schoolaName<<endl;//Error ,
}
…
Studentplato;
printStudent(plato); //本來想著要打印名字,但是由于對象被切割,會出現(xiàn)問題
?
?
為什么用引用了之后,可以避免被切割?
如果窺視C++底層的話,你就會發(fā)現(xiàn),reference往往是以指針實(shí)現(xiàn)出來的。因此,傳遞過來的指針。
如果你的參數(shù)是一個(gè)內(nèi)置類型,則采用pass by value會比pass by reference to const更加有效率一些。
請記住:
l? 盡量以pass by reference to const替換pass by value。前者通常比較高效,并可避免切割的問題。
l? 以上規(guī)則并不適用于內(nèi)置類型,以及STL的迭代器和函數(shù)對象。對它們而言,pass by value更加適當(dāng)。
轉(zhuǎn)載于:https://www.cnblogs.com/loveyakamoz/archive/2012/11/15/2772408.html
總結(jié)
以上是生活随笔為你收集整理的条款20 :宁以pass-by-reference-to-const 替换pass-by-value的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript跨域实践
- 下一篇: windowservice创建及部署