寧以pass-by-reference-to-const替換pass-by-value——effective c++學習筆記

來源:互聯網
上載者:User

 

 寧以pass-by-reference-to-const替換pass-by-value(Prefer pass-by-conference-to-const
to pass-by-value.)

pass-by-conference-to-const

class Point

{

    public:

        Point( ) : xval(2), yval(2){printf("%d,%d/n", xval, yval);}

        void SetXval(int i){xval = i;}

    private:

        int xval, yval;

};

void const_test(const Point *p)

{

    p->SetXval(9);

}

 

Point *p = new Point();

const_test(p);

這樣會編譯出錯:

“錯誤:將 ‘const Point’ 作為 ‘void Point::SetXval(int)’
的 ‘this’ 實參時丟棄了類型限定”

也就是說,“const
Point *p”,p的成員不可以發生更改。

類似,Point 的成員函數:

void SetXval(int
i)const{xval = i;}

則也會編譯出錯,因為在SetXval函數中,this是const的。const會修飾conference。

pass-by-value

void const_test(Point p)

{

}

Point p;

const_test(p);

這樣操作,從p到函數實參,會涉及一次copy建構函式調用。

pass-by-conference-to-const優勢:

1、 
沒有任何建構函式和解構函式被調用。

2、 
可以避免slicing(對象切割問題):當一個derived class以by-value的方式傳遞並被視為一個base class對象,base class的構造copy建構函式可以被調用,這樣新的對象中,derived class部分會被丟棄掉,而獲得一個base class對象。這樣調用virtual函數是,會調用base class的,而不是預期中的derived的。

3、 
對於內建類型對象,STL的迭代器,函數對象,pass
by-value往往比pass-by-reference-to-const
效率高些。除此之外,其他盡量以pass-by-reference-to-const代替pass-by-value。

 

注意:

1、 
盡量以pass-by-reference-to-const代替pass-by-value。前者通常比較高效,並可避免切割(slicing)問題。

2、 
以上規則並不適用內建類型對象,STL的迭代器,函數對象。對他們而言,pass-by-value往往比較適當。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.