2011-09-30 130 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