【发布时间】:2014-10-23 23:28:54
【问题描述】:
如果我将变量传递给函数但将该变量标记为常量,它会自动通过引用传递吗?
在 C++ 中
void foo(const int a)
测试后:否,因为它打印不同的内存位置。
void foo(const int a)
{
cout << &a << endl;
}
int main()
{
int a = 5;
foo(a);
cout << &a << endl;
return 0;
}
C
不对吧?因为我只能传递一个指向内存位置的指针,而不是真正通过引用。喜欢这里:Passing by reference in C
Java
也许编译器可以计算出final 应该指向同一个内存位置?
void foo(final int a)
C#
和 Java 一样吗?
void foo(const int a)
我知道我的问题中包含了 4 种语言,但由于我经常使用这 4 种语言,所以我很想知道。
有没有办法强制 Java 和 C# 处理这个问题?我知道在 C++ 中我可以将 & 添加到函数中,这正是我想要的。
void f(const int &a)
这就是我希望 Java 和 C# 编译器在幕后所做的事情。
【问题讨论】:
-
所有这些在语义上都是按值传递的。编译器可以在底层进行优化吗?当然,这是可能的。
-
我猜你问这个是因为你经常看到 C++ 函数原型将 const 对象的引用作为参数。这是一种有意的优化,允许函数参数值成为右值,而不必为函数调用复制它们(并且 C++11 添加了右值引用,作为替代方案)。但是,默认情况下不会通过引用传递 const 函数参数。
-
+1 表示具有多个语言标签的问题,这些标签实际上都与它们相关。
-
Java 原语没有参考。 Java 总是按值传递。
-
您的问题“有没有办法强制 Java 和 C# 处理 [] this”的目的是什么?如果您想传递相同的内存位置,以便该方法可以修改参数并允许调用者看到修改后的值,那么在 Java 中有一些方法可以做到这一点(我不太了解 C#)。但如果不是,那你为什么希望编译器在幕后传递地址,你为什么要关心?请注意,通过地址传递
int往往会使程序变慢,因为它需要间接访问该值。
标签: java c# c++ c pass-by-reference