2013-01-18 39 views
1

我學習C++和在讀book on it我碰到這個地方來了:在C++中通過引用傳遞參數是否必須是手動的?

struct Vector{ 
    int size; 
    double* elem; 
} 

void vector_init(Vector& v, int s){ 
    v.size = s; 
    v.elem = new double[s]; 
} 

所以在這裏,將void vector_init(Vector v, int s),沒有參考操作,是錯誤的?我是否需要使用&通過引用手動傳遞,同時傳遞對象,結構體,數組或其他任何參數?還有沒有其他方法可以做到這一點?比如說說void vector_init(Vector *v, int s)

任何幫助表示讚賞。

+0

只是一個提示:不要在C++中使用指針。總是有一個合理的更好的選擇。 – 0x499602D2

+0

@大衛並不總是;一個非擁有指針最好表示爲一個原始指針(當你不能使用引用時,比如需要賦值的類的成員(或者成員本身需要賦值)或者它可以爲空時) 。 –

+0

在C++中可以完全避免指針嗎? – rgamber

回答

1

void vector_init(Vector v, int s),沒有參考運算符,是錯的?

如果不通過引用傳遞v,進入功能vector_initv副本將被製成,你對副本進行操作。 vector_init返回該臨時副本將被銷燬,因此vector_init對原始v沒有影響。要操作原始v,您需要通過v作爲參考(與其他類型相同)。

也有任何替代方法來做到這一點?比如說說void vector_init(Vector *v, int s)

通過引用比通過指針傳遞更好的選擇。

+0

哦。所以當我做Vector v時,它傳遞的是引用的值,而不是引用本身,因此是&。我對嗎? – rgamber

+0

'向量v'傳遞'v'的值。 'Vector&v''正在通過v。 – billz

+1

的引用哦。我明白了,所以v的整個值作爲一個結構體將被傳遞。所以更改將發生在副本上,原始v將保持不變。謝謝。 – rgamber

2

沒有「參照操作符」。

聲明者&只被添加到您希望通過引用傳遞的函數參數中。傳遞引用參數看起來與傳遞值相同。

1

通過引用(void vector_init(Vector &v, int s))或實際上傳遞一個值由指針void vector_init(Vector *v, int s)具有基本上相同的含義。

主要區別在於,當您通過引用傳遞時,您被迫傳遞一個有效參數(NULL不起作用),並且當您通過指針傳遞時,必須將您的參數顯式轉換爲指針通過引用傳遞時)

當你通過值傳遞的東西爲無效vector_init(Vector v, int s)這是不同的完成:該參數是通過拷貝構造函數和函數的範圍內盡一切修改複製的本地的本地副本參數,你不能通過傳值來修改原始參數。你並沒有真正傳遞你的變量,你傳遞了它的一個副本。

這甚至意味着,如果參數是大型類或結構或具有昂貴的拷貝構造函數,那麼性能問題也會發生。

+0

通過值傳遞的參數並不總是被複制,它也可以被移動。 –

+0

@SethCarnegie:是不是隻有rvalue引用可能? – Jack

+2

不,右值引用只是一個引用,而不是副本。移動發生在使用右值引用初始化值(並且存在移動構造函數)時。編譯器會自動將xvalue轉換爲右值引用。另一個更好的選擇是複製/移動可以被忽略(編譯器優化),甚至不會發生移動。 –

相關問題