2012-12-19 59 views
8

可能重複:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?規則在C++中使用參考

在C++中有沒有那種什麼時候一個必須的規則或指導,或者至少應該選擇使用通過引用比通過值?

如果是有關對象的大小,儘可能知道有些對象(小老實點)它可能變得很難判斷。

+0

看到這個答案:http://stackoverflow.com/a/114351/6345(指針與參考) –

+0

同樣的問題被問了這麼多次在這個網站上... http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c – nogard

+0

一個比較好的規則:if(sizeof(SomeType)> sizeof(void *))//使用引用' –

回答

7

只要你想改變參數在函數外部可見,你應該通過引用傳遞。這是通過非const參考,主要是由邏輯,而不是效率的動機。

當您處理的數據類型的大小大於寄存器的大小時,您應該通過(主要是const)引用。由於參考文獻主要是const,因此您無法對其進行任何更改,所以這是由效率驅動的。

+0

即使對於較大的對象,通過值傳遞通常也比參考更快,因爲缺少「restrict」。 – Pubby

+0

注意:即使對於小數據類型,手工製作的拷貝構造函數的存在也會鼓勵您使用'const&'。這個慣用的例子是'shared_ptr',它並不像許多人想象的那麼輕量級。 –

3
  1. 如果您不想調用該對象的複製構造函數(例如,如果這樣做是因爲對象大小而膨脹)。
  2. 當你真正需要的參考,而不是隻值(swap(a,b),例如 - 因爲你實際上是在以使交換需要原始引用。)
3

通常情況下,我在使用通過引用傳遞以下幾種情況:

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); 
1

不想pass-by-reference-to-constpass-by-value。按值傳遞是一項昂貴的操作,因爲對象的副本是由複製構造函數生成的。另外,如果類中有一些非原始數據成員(例如:std::string),則每次創建類的新對象時,也會創建這些std::string對象。

通過引用也可以避免slicing problem。如果通過值將派生類對象傳遞給期望基類對象的函數,派生類的派生特徵將被切掉,並且函數內部的對象將表現爲基類對象。如果通過參考傳遞,可以避免切片。

儘管如此,有些情況下您不能通過引用傳遞。如果你的函數參數或返回值需要有NULL值,你不能使用引用。