【问题标题】:What's the difference between a Java reference and C++ referenceJava 参考和 C++ 参考有什么区别
【发布时间】:2012-02-07 23:10:23
【问题描述】:

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

我知道这可能看起来很愚蠢,但为什么我不能在 C++ 中做到这一点。

float &f = new float;

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

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

String s = new String("something")

String s 称为字符串引用。

Java 中的“引用”一词与 C++ 中的含义相同吗?

【问题讨论】:

  • 在 C++ 术语中,所有声明为对象类型的 Java 变量实际上都是指向该对象的 指针,并且在 C++ 中没有 no 引用Java,只是指针传递(按值)。 (想一想:你能不能实现一个swap函数?)
  • 看看这个链接,digitalneuron.in/blog/get/1

标签: java c++ pointers reference


【解决方案1】:

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- 该指针意味着您无法更改指向的float,并且在Java 中绝对可以使用引用来更改对象。想想ArrayList 引用——例如,如果你不能更改ArrayList,你就不能调用add。还是我误解了你的意思?
  • 是的,您应该考虑像 c 中的常量指针,而不是 c++ - 即忽略 const 方法。从这个意义上说:没有 const float* f 将允许我们执行 *f = 1.0,这在 java 中是行不通的。来自 c++ 的扩展 const 概念根本没有映射到 java.. 遗憾的是,我认为它非常有用。
  • (在 Java 中)设置对 NULL 的引用。
  • 如果您使用共享指针,您将获得与 Java 相同的功能。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    int foo = 0;
    

    然后你可以有一个 指针 引用 foo 的地址:

    int* bar = &foo;
    

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          你也可以看看这个link

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2010-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-31
              • 2017-01-08
              • 1970-01-01
              • 2017-01-13
              • 2010-09-23
              相关资源
              最近更新 更多