C ++中的'out'关键字

时间:2011-09-30 07:33:43

标签: c++

输出参数的C#'out'关键字是否等同于C ++?

我想让一个构造函数也设置一些引用变量的引用。

3 个答案:

答案 0 :(得分:11)

没有直接的等价物。在C ++中,您可以选择传递值,传递指针值或传递引用参数。后两者可用于从函数中获取数据。

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

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

答案 1 :(得分: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* &) {...}

然后它不是等价的。它仍然违反const-correct代码,你真的分配指针,这与初始化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

答案 2 :(得分:1)

您不需要out关键字。你使用指针。

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

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

看看我在那里做了什么?您将x的引用传递给函数,以便函数实际将新值写入x。