回答
没有直接等同。在C++中,您可以选择按值传递,传递指针值还是传递引用参数。后两者可用于从功能中获取数据。
VOID foo(int* pnA, int& nB)
{
*pnA = 1;
nB = 2;
}
int nA, nB;
foo(&nA, nB);
// nA == 1, nB == 2;
该死!我需要变得更快! +1 – Phil
(你应该更喜欢对指针的引用,因为语义更清晰:对象必须存在于--i.e之前。你不能传递一个空指针) –
我会争辩说,在C++中传递引用是* * *等价于C#'out'。两者都将语义从逐个调用改为逐个引用。授予C#版本更严格,确保在函数内部进行赋值......但是,传递指针仍然是按值赋值,并且可以在C#中使用可变对象(或“unsafe”)进行仿真。 – 2011-09-30 07:41:00
您不需要out关键字。你使用指针。
int x = 47;
f(&x);
//x is 5
void f(int* p)
{
*p = 5;
}
见我做什么呢?您将x的引用传递给该函数,以便函数实际为x写入一个新值。
指针不等价。用C#的'out',你可以在某个函数中初始化该参数。 –
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
。
- 1. 在C++中抛出关键字
- 2. c#关键字
- 3. #line关键字在C
- 4. const关键字在objective-c
- 5. 在C#override关键字
- 6. c#Linq关键字?
- 7. 在C++中使用C关键字
- 8. 给出关键字列表
- 9. 突出显示关键字
- 10. 突出关键字文本
- 11. c中的“HANDLE”关键字
- 12. C++ constexpr关键字放置
- 13. C#构造base关键字
- 14. Objective-c - 类关键字
- 15. Objective C关键字'in'
- 16. C++关键字可变
- 17. C#'ref'关键字,性能
- 18. 运算符关键字C++
- 19. c#覆盖关键字
- 20. C++关键字使用
- 21. C++ Vector关键字“ref”
- 22. 指针关键字/ C++
- 23. const关键字使用C++
- 24. 在什么情况下C#'是'关键字抛出异常?
- 25. 返回与多值的“出”关键字在C#
- 26. 在关键字
- 27. intellisense中出现atlbase.h错误时出现“C++关键字”
- 28. PHP搜索关键字和输出此行关键字是
- 29. 将C#转换为Excel,将关键字替换为关键字
- 30. objective c 2.0 - 关键字铸造与非关键字铸造
你想只标注你的函数参数,以表明其价值将改变函数返回时?还是你问如何调用一个函数,并通过引用(指针)传递参数,使函数可以持久地改变调用者传入的值? – selbie
你是什么意思“设置几个变量的引用”?这可能不会从C#转换到C++。 –
你也许可以让自己有一个模板类有类似的功能可能允许你写的功能,如:无效的getValue(出值);如果该值没有在函数中设置,就会抛出它。 –
markh44