条款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更加適當。
轉載于:https://www.cnblogs.com/loveyakamoz/archive/2012/11/15/2772408.html
總結
以上是生活随笔為你收集整理的条款20 :宁以pass-by-reference-to-const 替换pass-by-value的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript跨域实践
- 下一篇: windowservice创建及部署