2011-09-30 68 views
5

是否有一個等同於C#「出」關鍵字的輸出參數,但是在C++?在C「出」關鍵字++

我想有一個構造函數也設置爲變量的一對夫婦引用的地方被調用。

+0

你想只標註你的函數參數,以表明其價值將改變函數返回時?還是你問如何調用一個函數,並通過引用(指針)傳遞參數,使函數可以持久地改變調用者傳入的值? – selbie

+0

你是什麼意思「設置幾個變量的引用」?這可能不會從C#轉換到C++。 –

+0

你也許可以讓自己有一個模板類有類似的功能可能允許你寫的功能,如:無效的getValue(出值);如果該值沒有在函數中設置,就會拋出它。 – markh44

回答

9

沒有直接等同。在C++中,您可以選擇按值傳遞,傳遞指針值還是傳遞引用參數。後兩者可用於從功能中獲取數據。

VOID foo(int* pnA, int& nB) 
{ 
    *pnA = 1; 
    nB = 2; 
} 

int nA, nB; 
foo(&nA, nB); 
// nA == 1, nB == 2; 
+0

該死!我需要變得更快! +1 – Phil

+0

(你應該更喜歡對指針的引用,因爲語義更清晰:對象必須存在於--i.e之前。你不能傳遞一個空指針) –

+0

我會爭辯說,在C++中傳遞引用是* * *等價於C#'out'。兩者都將語義從逐個調用改爲逐個引用。授予C#版本更嚴格,確保在函數內部進行賦值......但是,傳遞指針仍然是按值賦值,並且可以在C#中使用可變對象(或「unsafe」)進行仿真。 – 2011-09-30 07:41:00

0

您不需要out關鍵字。你使用指針。

int x = 47; 
f(&x); 
//x is 5 

void f(int* p) 
{ 
    *p = 5; 
} 

見我做什麼呢?您將x的引用傳遞給該函數,以便函數實際爲x寫入一個新值。

+0

指針不等價。用C#的'out',你可以在某個函數中初始化該參數。 –

3

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