什么';Java引用和C++;参考

什么';Java引用和C++;参考,java,c++,pointers,reference,Java,C++,Pointers,Reference,所以我一直在想(在阅读这个JavaPDF时) 我知道这可能看起来很愚蠢,但是为什么我不能在C++中这样做呢?p> float &f = new float; 这不是说f的参考是新浮点的地址吗 在Java中,我看到类似这样的东西 String s = new String("something") 字符串s称为字符串引用 在java中,“引用”一词是否具有与C++中相同的含义?< p>不,在java中声明字符串s时,s不包含新字符串的地址,但它的值在这种情况下是某种东西。p> 您可以查

所以我一直在想(在阅读这个JavaPDF时)

我知道这可能看起来很愚蠢,但是为什么我不能在C++中这样做呢?p>
float &f = new float;
这不是说f的参考是新浮点的地址吗

在Java中,我看到类似这样的东西

String s = new String("something")
字符串s
称为字符串引用


在java中,“引用”一词是否具有与C++中相同的含义?

< p>不,在java中声明字符串s时,s不包含新字符串的地址,但它的值在这种情况下是某种东西。p>
您可以查看
这篇
文章,了解有关Java中可变地址位置的更多信息,这些信息有点毫无意义

> 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++!
std::string*myString=newstd::string(“这是一个字符串”);

在C++中,你使用指针,所以如果你有:

int foo = 0;
然后,您可以使用一个指针来引用foo的地址:

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

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

是的,我同意乔妮,C++指针在语法上更接近于java中的引用。p>


< C++中指针和引用之间的另一个重要区别是指针可以指向一个真实对象,也可以等于null。根据定义,C++中的引用总是指向一个实际对象或变量。当你声明它时,你必须把它指定给真实的东西

要回答您的问题,对于最佳实践,请仅使用new或malloc操作符来分配空间。假设指针是新的指针,指针和引用之间的最大区别是必须使用显式运算符*操作符来引用指针,但不使用操作符引用引用。

< P> java参数接近C++引用。比如,

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

您也可以查看此信息。

在java参考中,您可以多次引用值或方法。但是在C++中,只能引用单个引用变量中的一个值。所以java java变量C++中指针的可能性较大,而且Java自动运行垃圾回收器,所以C++中没有使用<强> >删除< /St>>密钥,在C++术语中,所有用对象类型声明的Java变量实际上是指向对象的指针,Java中没有引用,只有指针传递(通过值)。(想一想:你能实现一个
swap
函数吗?)看一看这个链接,最合适的imho应该是一个指向常量对象的指针,即
const float*f
,因为java中也不允许给内存地址分配一个新值。@Voo-这个指针意味着你不能更改所指向的
float
,在Java中,引用绝对可以用来更改对象。想想
ArrayList
引用-例如,如果无法更改
ArrayList
,则无法调用
add
。还是我误解了你的意思?是的,你应该考虑一个常数指针,如C,而不是C++——也就是忽略const方法。从这个意义上说:如果没有常量
float*f
,我们就可以执行
*f=1.0
,这在java中是不起作用的。从C++中扩展的const概念根本不映射到java。遗憾的是,我认为它非常有用。(在Java中)将引用设置为NULL。如果使用共享指针,您将获得与Java相同的功能。
float* f = new float(0);  // Allocate memory
...                       
delete f;                 // Free memory