输出参数的C#'out'关键字是否等同于C ++?
我想让一个构造函数也设置一些引用变量的引用。
答案 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。