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)
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.