1.pass-by-value的情況:
缺省情況C++以pass-by-value(繼承C的方式)傳遞對象至(或來自)函數。函數參數都是以實際參數的復件為初值,調用端所獲得的也是函數返回值的一個復件,復件由對象的拷貝構造函數產出,可能使pass-by-value成為耗時的操作。
2.耗時的原因
類的對象作為函數參數時,如果使用值傳遞,要先拷貝一份實參的副本,需要調用類的拷貝構造函數,函數結束時副本被銷毀,需要調用析構函數。如果該類是派生類,調用的函數更多,流程更多更復雜。
拷貝構造函數
拷貝構造函數的調用:如果一個新對象被定義,一定會有一個構造函數被調用,如果沒有新對象被定義,就不會有構造函數被調用。
3.pass-by-reference的優勢
①pass-by-reference:沒有任何構造函數或析構函數被調用,因為沒有任何對象被新建。參數聲明中加上const,防止傳入的對象被修改。
②*避免slicing(對象切割)問題
值傳遞:子類對象被切割成父類對象,功能缺失
引用傳遞:解決該問題
4.pass-by-reference的底層本質
reference往往以指針的形式實現,傳遞的是指針
對象為內置類型(如int),STL的迭代器和函數對象,pass-by-value高效一些。
5.pass-by-reference的舉例
class A{…};
void action(A a);//值傳遞pass-by-value
void action(const A& a);//引用傳遞pass-by-reference