C++中的'out'关键字

Sir*_*lot 9 c++

对于out参数,C++中是否有等效的C#'out'关键字?

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

Rom*_* R. 11

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

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

int nA, nB;
foo(&nA, nB);
// nA == 1, nB == 2;
Run Code Online (Sandbox Code Playgroud)

  • 该死的!我需要变得更快!+1 (2认同)

Seb*_*ach 5

C#out意味着某些值的初始化是在函数内完成的。C++ 没有等效的。

非成员变量的初始化始终在声明点完成,而对于成员变量,则在构造函数中、构造函数主体的左大括号之前完成。

幸运的是,现代 C++ 编译器采用RVO(返回值优化),因此 const 正确性通常不会带来性能损失:

const Foo foo = create_a_foo();
Run Code Online (Sandbox Code Playgroud)

一个好的编译器会发出类似以下 p 代码的内容:

BYTE foo_store [sizeof (Foo)];
create_a_foo (foo_store);
const ALIAS Foo foo = foo_store;
Run Code Online (Sandbox Code Playgroud)

其中 ALIAS 只是 foo_store 的另一个(键入的)名称,没有任何运行时成本。foo_store 的内存分配通常也是免费的,因为它基本上与堆栈帧增量无关。

即使您传递对指针的引用,

void create_a_foo (Foo* &) {...}
Run Code Online (Sandbox Code Playgroud)

那么它就不是等价的。它仍然违反 const 正确的代码,并且您实际上正在分配给一个指针,这与初始化 Foo不同。

Foo *p;  // initialization of pointer is HERE, and nowhere else
create_a_foo(p);  // creates a Foo and _assigns_ it to po.
Run Code Online (Sandbox Code Playgroud)

如果您想要精确的 C# 克隆,那么对指针的引用充其量只是一种 hack,out就像对boost::optional.