可能重複:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?規則在C++中使用參考
在C++中有沒有那種什麼時候一個必須的規則或指導,或者至少應該選擇使用通過引用比通過值?
如果是有關對象的大小,儘可能知道有些對象(小老實點)它可能變得很難判斷。
可能重複:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?規則在C++中使用參考
在C++中有沒有那種什麼時候一個必須的規則或指導,或者至少應該選擇使用通過引用比通過值?
如果是有關對象的大小,儘可能知道有些對象(小老實點)它可能變得很難判斷。
只要你想改變參數在函數外部可見,你應該通過引用傳遞。這是通過非const
參考,主要是由邏輯,而不是效率的動機。
當您處理的數據類型的大小大於寄存器的大小時,您應該通過(主要是const
)引用。由於參考文獻主要是const
,因此您無法對其進行任何更改,所以這是由效率驅動的。
即使對於較大的對象,通過值傳遞通常也比參考更快,因爲缺少「restrict」。 – Pubby
注意:即使對於小數據類型,手工製作的拷貝構造函數的存在也會鼓勵您使用'const&'。這個慣用的例子是'shared_ptr',它並不像許多人想象的那麼輕量級。 –
swap(a,b)
,例如 - 因爲你實際上是在以使交換需要原始引用。)通常情況下,我在使用通過引用傳遞以下幾種情況:
1)objetc是大小比指針更大:在這種情況下,如果我不想再修改objetc,使用const引用:
Reference object;
foo(object);
以foo聲明爲:
void foo(const Reference & object);
2)對於碼澄清,試圖避免這樣thigs:
int f1 = xxx;
int f2 = yyy;
int f3 = zzz;
....
foo(f1, f2, ............)
使用的結構:
struct X
{
int f1;
int f2;
int f3;
....
};
X x;
x.f1 = xxx;
.....
foo(X);
以foo定義爲:
foo(const X & x);
3)加速傾注:請記住,調用函數必須將參數4)你需要修改函數中的參數。
Reference object;
foo(object);
以foo聲明:
void foo(Reference & object);
不想pass-by-reference-to-const
到pass-by-value
。按值傳遞是一項昂貴的操作,因爲對象的副本是由複製構造函數生成的。另外,如果類中有一些非原始數據成員(例如:std::string
),則每次創建類的新對象時,也會創建這些std::string
對象。
通過引用也可以避免slicing problem
。如果通過值將派生類對象傳遞給期望基類對象的函數,派生類的派生特徵將被切掉,並且函數內部的對象將表現爲基類對象。如果通過參考傳遞,可以避免切片。
儘管如此,有些情況下您不能通過引用傳遞。如果你的函數參數或返回值需要有NULL值,你不能使用引用。
看到這個答案:http://stackoverflow.com/a/114351/6345(指針與參考) –
同樣的問題被問了這麼多次在這個網站上... http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c – nogard
一個比較好的規則:if(sizeof(SomeType)> sizeof(void *))//使用引用' –