Java引用和C++引用有什么区别?

3

我在阅读这份 Java PDF 时想到了一件事...

我知道这可能看起来有些傻,但为什么我不能在 C++ 中这样做呢。

float &f = new float;

这句话的意思是f的引用是新浮点数的地址吗?

在Java中,我看到了这样的代码:

String s = new String("something")

String s被称为字符串引用。

在Java中,“引用”这个词的含义和C++中相同吗?


3
用 C++ 的术语来说,所有用对象类型声明的 Java 变量实际上都是指向对象的指针,在 Java 中并没有引用,只有通过值传递指针的方式。(思考一下:你能实现一个交换函数吗?) - Kerrek SB
请参考:https://dev59.com/-G435IYBdhLWcg3w2z98#5174827 - Martin York
请查看此链接:http://digitalneuron.in/blog/get/1 - Xinus
7个回答

14

Java 中的引用更接近 C++ 中的指针,而不是 C++ 中的引用。在 Java 中,你可以使用引用来执行以下操作:

  • 更改它所引用的对象
  • 检查两个引用是否相等或不相等
  • 向所引用的对象发送消息。

在 C++ 中,指针具有相同的属性。因此,你在 C++ 中需要寻找类似下面这样的代码:

float* f = new float;

这是完全合法的。为了更好地比较,以下是Java代码:
String myString = new String("This is a string!"); // Normally I wouldn't allocate a string here, but just for the parallel structure we will.
System.out.println(myString.length());

/* Reassign myString to point to a different string object. */
myString = new String("Here's another string!");
System.out.println(myString.length());

将会映射到以下C++代码:

std::string* myString = new std::string("This is a string");
std::cout << myString->length() << std::endl;

delete myString; // No GC in C++!

/* Reassign myString to point to a different string object. */
myString = new std::string("Here's another string!");
std::cout << myString->length() << std::endl;

delete myString; // No GC in C++!

希望这有所帮助!

在我看来,最好的选择是指向常量对象的指针,即 const float* f,因为在 Java 中也不允许将新值分配给内存地址。 - Voo
@Voo- 这个指针意味着你无法更改被指向的 float,而在 Java 中,引用绝对可以用来改变对象。想想 ArrayList 引用 - 如果你不能更改 ArrayList,例如不能调用 add。或者我是否误解你的意思? - templatetypedef
是的,你应该把常量指针看作C语言中的概念,而不是C++ - 也就是说,忽略const方法。从这个意义上讲:如果没有const,float* f会允许我们执行*f = 1.0,但在Java中无法实现。C++中的扩展const概念在Java中根本无法映射...很遗憾,因为我认为它非常有用。 - Voo
(在Java中)将引用设置为NULL。 - Martin York
如果您使用共享指针,您将获得与Java相同的功能。 - Martin York

0

在C++中,你使用指针来处理这样的情况:

int foo = 0;

然后,您可以使用以下代码将指针引用到foo的地址:

int* bar = &foo;

这行代码表示bar的值是foo的内存地址。 Java通过引用来操作对象,每个对象都是一个引用,但它也会自动收集垃圾。如果你在C++中使用new关键字,你需要自己清理内存:

float* f = new float(0);  // Allocate memory
...                       
delete f;                 // Free memory

0

在Java中,当你声明String s时,s并不包含新String的地址,而是它的值,在这种情况下是something。

你可以查看this帖子了解有关Java变量地址位置的更多信息,这有点毫无意义。


0

是的,我同意Joni的观点,C++指针在语法上更接近Java中的引用。

C++中指针和引用之间的另一个重要区别是,指针可以指向一个真实的对象,也可以等于null。而C++中的引用则总是指向一个真实的对象或变量。在声明引用时,必须将其赋值给某个真实的东西。


0
回答您的问题,为了最佳实践,请仅使用 new 或 malloc 运算符来分配空间。假设您对指针还不熟悉,指针和引用之间的主要区别在于您必须使用显式运算符(* 运算符)来解除指针引用,而引用则不需要使用运算符来解除引用。

0

Java参数与C++引用相似。例如:

  • 当您传递一个对象时,实际上是传递了一个引用值。因此,在Java中所有对象都是引用。
  • 另一方面,Java通过值传递方法。

您还可以查看link


0
在Java中,您可以多次引用值或方法。但是在C++中,您只能在单个引用变量中引用一个值。因此,在Java中,引用变量更像是C++中的指针。此外,Java会自动运行垃圾回收器,因此没有使用C++中用于释放内存的“delete”键的必要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接