回答
沒有直接等同。在C++中,您可以選擇按值傳遞,傳遞指針值還是傳遞引用參數。後兩者可用於從功能中獲取數據。
VOID foo(int* pnA, int& nB)
{
*pnA = 1;
nB = 2;
}
int nA, nB;
foo(&nA, nB);
// nA == 1, nB == 2;
該死!我需要變得更快! +1 – Phil
(你應該更喜歡對指針的引用,因爲語義更清晰:對象必須存在於--i.e之前。你不能傳遞一個空指針) –
我會爭辯說,在C++中傳遞引用是* * *等價於C#'out'。兩者都將語義從逐個調用改爲逐個引用。授予C#版本更嚴格,確保在函數內部進行賦值......但是,傳遞指針仍然是按值賦值,並且可以在C#中使用可變對象(或「unsafe」)進行仿真。 – 2011-09-30 07:41:00
您不需要out關鍵字。你使用指針。
int x = 47;
f(&x);
//x is 5
void f(int* p)
{
*p = 5;
}
見我做什麼呢?您將x的引用傳遞給該函數,以便函數實際爲x寫入一個新值。
指針不等價。用C#的'out',你可以在某個函數中初始化該參數。 –
C#的out
意味着初始化的某些值在一個函數內完成。 C++沒有相同的功能。
非構件變量的初始化爲總是在聲明處完成,而對於成員變量,它在構造函數體的左大括號之前在構造函數中完成。
幸運的是,現代C++編譯器鍛鍊RVO (Return Value Optimization),所以const正確性通常是在不影響性能:
const Foo foo = create_a_foo();
一個好的編譯器會發出類似下面的p代碼:
BYTE foo_store [sizeof (Foo)];
create_a_foo (foo_store);
const ALIAS Foo foo = foo_store;
在哪裏ALIAS只是foo_store的另一個(鍵入)名稱,沒有任何運行成本。 foo_store的內存分配通常也是空閒的,因爲它基本上不像堆棧幀增量。
即使你傳遞一個參考的指針,
void create_a_foo (Foo* &) {...}
那麼它是不等價。它仍然是對常量,正確的代碼,你真的是分配給一個指針,這是不一樣的初始化一個Foo。
Foo *p; // initialization of pointer is HERE, and nowhere else
create_a_foo(p); // creates a Foo and _assigns_ it to po.
引用到指針充其量是一個黑客,如果你打算精確的C#out
克隆,彷彿如參考至boost::optional
。
- 1. c#關鍵字
- 2. #line關鍵字在C
- 3. 在C#override關鍵字
- 4. c#Linq關鍵字?
- 5. 關閉在Visual C++中突出顯示「事件」關鍵字
- 6. 給出關鍵字列表
- 7. Objective-c - 類關鍵字
- 8. c#覆蓋關鍵字
- 9. C#構造base關鍵字
- 10. C++關鍵字使用
- 11. C#'ref'關鍵字,性能
- 12. C++ Vector關鍵字「ref」
- 13. const關鍵字使用C++
- 14. 在關鍵字
- 15. 返回與多值的「出」關鍵字在C#
- 16. intellisense中出現atlbase.h錯誤時出現「C++關鍵字」
- 17. objective c 2.0 - 關鍵字鑄造與非關鍵字鑄造
- 18. 將C#轉換爲Excel,將關鍵字替換爲關鍵字
- 19. 使用帶有「null」關鍵字的「is」關鍵字c#7.0
- 20. const關鍵字在函數之前C
- 21. 在C#中使用SQL關鍵字MySqlCommand.CommandText
- 22. 在C#中解釋yield關鍵字
- 23. 在c#中使用除了關鍵字#
- 24. 解釋在C++中的關鍵字新
- 25. 關鍵字如何在C#中工作?
- 26. extern關鍵字在C中的行爲
- 27. 運算符關鍵字在c + +中
- 28. extern關鍵字不同於c到C++?
- 29. C# - 關鍵字的字符串
- 30. c#字典從關鍵字選擇值
你想只標註你的函數參數,以表明其價值將改變函數返回時?還是你問如何調用一個函數,並通過引用(指針)傳遞參數,使函數可以持久地改變調用者傳入的值? – selbie
你是什麼意思「設置幾個變量的引用」?這可能不會從C#轉換到C++。 –
你也許可以讓自己有一個模板類有類似的功能可能允許你寫的功能,如:無效的getValue(出值);如果該值沒有在函數中設置,就會拋出它。 –
markh44