Java引用和C ++引用之间有什么区别

时间:2012-02-07 23:10:24

标签: java c++ pointers reference

所以我一直在想(在阅读这篇Java pdf时)......

我知道这可能看起来很愚蠢,但为什么我不能在c ++中这样做。

float &f = new float;

这不是说f的引用是新浮点的地址吗?

在Java中,我看到类似这样的内容

String s = new String("something")

String s被称为字符串引用。

Java中的'reference'一词与C ++中的含义是否相同?

7 个答案:

答案 0 :(得分: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++!

希望这有帮助!

答案 1 :(得分:0)

当你声明String时,在Java中没有,s不包含新String的地址,但是它的值在这种情况下是某种东西。

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

C ++中指针和引用之间的另一个重要区别,指针可以指向真实对象,也可以等于null。根据定义,C ++中的引用始终指向真实对象或变量。在声明它时,您必须将它分配给真实的东西。

答案 4 :(得分:0)

要回答您的问题,为了获得最佳实践,请仅使用new或malloc运算符来分配空间。假设你是指针的新手,指针和引用之间的最大区别在于你必须使用显式运算符 - *运算符来取消引用指针,但是你不使用运算符来取消引用引用。

答案 5 :(得分:0)

Java参数接近C ++引用。例如;

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

您还可以查看此link

答案 6 :(得分:0)

在java引用中,您可以多次引用值或方法。但是在c ++中,您只能在一个引用变量中引用一个值。因此在java中,引用变量更可能是c ++的指针。此外,java会自动运行垃圾收集器,因此不会使用c ++中用于释放内存的 delete 键。