C++/Java引用变量
C++/Java reference variable
在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++
中,对象可以保存在stack
和heap
上,而在Java
中,对象存储在only on heap
上,而指向对象的对象引用在堆栈上。
Foo*bar=new Foo();//C++:*条在堆栈上,而分配的内存在堆上
Foo bar=new Foo();//Java:堆栈上的条形图和使用堆上新的创建的对象
此外,当我在C++中执行此操作时:
Foo酒吧;bar也是指针吗?如果没有,那么这是否意味着存在存储器结构的差异
Foo酒吧;
它不是指针。它只是在堆栈上创建的一个对象。
在Java中,所有对象都是引用或指针,或者使用new
返回地址C++指针和Java"指针"之间的区别在于,在Java中不能有指针算术。
上次我读《Java编程语言》时,它说引用是指针。
好吧,如果你想挑剔,它们实际上并不像那样像指针:
- Java指针不允许使用指针算术不能通过增加、减少、相乘等指针来移动它们在内存中所指向的内容
- 非强类型在C中,您可以将指针从一种类型强制转换为几乎任何类型,而不会产生任何后果(只要您小心)。在Java中,如果尝试在不兼容的类型之间进行强制转换,则会出现异常
否则,它们的行为方式与指针几乎相同,只要您不需要C风格指针的任何上述功能,您可能不会注意到差异。
指针是表示内存地址的值
引用是指引用对象的值
指针是实现引用的一种方法。事实上,有几种方法可以使用指针来实现引用,因为大多数对象占用多个地址,所以必须定义引用指向的地址。
几个区别:
- 你可以用指针来计算,因为地址是整数值。参考值没有内在的意义,它只是代表一个对象
- 指针可以指向任何值,例如对象中的字段;引用总是代表整个对象
将它们与Pascal指针进行比较会更准确。它们有许多相同的特性:强类型、无算术、可以为null。
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 如果非动态变量被指针引用,何时超出范围?
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 地址运算符是否返回变量引用的对象的地址
- 未在另一个函数中设置变量引用的问题
- 英特尔样式内联程序集和 AT&T 样式中的变量引用,C++
- 将成员变量引用为类成员
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 何时解析 C++11 lambda 表达式中的变量引用
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++强制对变量引用进行编译优化,使之成为直接的
- Boost变量引用和相等比较
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 为什么要在Java中生成变量引用数组
- 捕获和调试对移动lambda内部局部变量引用的无效使用
- 在变量初始化后更改变量引用
- 从'C'程序中提取变量定义和变量引用