C++/Java引用变量

C++/Java reference variable

本文关键字:变量 引用 Java C++      更新时间:2023-10-16

在Java中,当我执行时

Foo bar = new Foo();

bar将是一个包含新建对象地址的变量。我的教授称之为参考变量

前一行相当于C++中的这一行:

Foo *bar = new Foo();

这里,条是指向对象的指针

那么,Java中的引用变量基本上就是一个指针,这是真的吗?

此外,当我在C++中这样做时:

Foo bar;

bar也是指针吗?如果不是,那么这是否意味着之间的内存结构存在差异

Foo bar;

Foo *bar = new Foo();

C++中的指针的行为与Java中的引用类似。

然而,Foo bar;Foo *bar = new Foo();非常不同。第一个创建一个具有自动持续时间的Foo实例。它将在创建它的块的末尾被销毁。第二个创建了一个动态分配的Foo实例。它将一直保留到被明确删除为止。

如果希望对象在函数返回后存在,则不能使用第一个。如果在函数返回后使用指针或对它的引用,就会发生不好的事情。在这种情况下,你必须使用第二种形式

第一种形式的优点是您不必担心内存管理。它将在其作用域结束时自动销毁。对于第二个表单,您必须手动删除它,或者使用某种智能指针来管理它。

如果您想知道在给定每种语言的规范的情况下,术语"指针"是否适用于每种语言,那么yes

Java语言规范中,Java引用被称为"指针":

对象类实例数组

引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的null引用,它不引用任何对象。

在C++语言规范(这是一个国际ISO标准,C++标准)中,C++指针被称为"指针"。

那么,Java中的引用变量基本上是指针,这是真的吗?

->简而言之,是!但是,由于c++允许您操作指针,java则不允许。(相似是区分的好词)

Foo bar; // bar is allocated on stack in c++

-->在java中,这只是Foo类型的bar的声明。

c++中,对象可以保存在stackheap上,而在Java中,对象存储在only on heap上,而指向对象的对象引用在堆栈上。

Foo*bar=new Foo();//C++:*条在堆栈上,而分配的内存在堆上

Foo bar=new Foo();//Java:堆栈上的条形图和使用堆上新的创建的对象

此外,当我在C++中执行此操作时:

Foo酒吧;bar也是指针吗?如果没有,那么这是否意味着存在存储器结构的差异

Foo酒吧;

它不是指针。它只是在堆栈上创建的一个对象。

在Java中,所有对象都是引用或指针,或者使用new返回地址C++指针和Java"指针"之间的区别在于,在Java中不能有指针算术。

上次我读《Java编程语言》时,它说引用指针。

好吧,如果你想挑剔,它们实际上并不像那样像指针:

  1. Java指针不允许使用指针算术不能通过增加、减少、相乘等指针来移动它们在内存中所指向的内容
  2. 非强类型在C中,您可以将指针从一种类型强制转换为几乎任何类型,而不会产生任何后果(只要您小心)。在Java中,如果尝试在不兼容的类型之间进行强制转换,则会出现异常

否则,它们的行为方式与指针几乎相同,只要您不需要C风格指针的任何上述功能,您可能不会注意到差异。

指针是表示内存地址的值
引用是指引用对象的值
指针是实现引用的一种方法。事实上,有几种方法可以使用指针来实现引用,因为大多数对象占用多个地址,所以必须定义引用指向的地址。

几个区别:

  • 你可以用指针来计算,因为地址是整数值。参考值没有内在的意义,它只是代表一个对象
  • 指针可以指向任何值,例如对象中的字段;引用总是代表整个对象

将它们与Pascal指针进行比较会更准确。它们有许多相同的特性:强类型、无算术、可以为null。