В чем разница между ссылкой на Java и ссылкой на C ++ - PullRequest
3 голосов
/ 08 февраля 2012

Вот я и подумал (читая этот Java pdf) ...

Я знаю, что это может показаться глупым, но почему я не могу сделать это на С ++.

float &f = new float;

Разве это не говорит, что ссылка f является адресом нового числа с плавающей точкой?

В Java я вижу что-то подобное

String s = new String("something")

String s называется ссылкой на строку.

Имеет ли слово «ссылка» в Java то же значение, что и в C ++?

Ответы [ 7 ]

14 голосов
/ 08 февраля 2012

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++!

Надеюсь, это поможет!

0 голосов
/ 09 апреля 2018

В ссылке на Java вы можете ссылаться на значения или методы более одного раза. Но в C ++ вы можете ссылаться только на одно значение в одной ссылочной переменной. Таким образом, в java ссылочные переменные являются более вероятными указателями на c ++. Более того, java автоматически запускает сборщик мусора, поэтому не используется ключ delete , который используется в c ++ для освобождения памяти.

0 голосов
/ 08 февраля 2012

Параметры Java близки к ссылкам на C ++.Например;

  • Когда вы передаете объект, на самом деле вы передаете эталонное значение.Поэтому все объекты являются ссылками в Java.
  • С другой стороны, Java передает методы по значению.

Вы также можете проверить эту ссылку out.

0 голосов
/ 08 февраля 2012

Чтобы ответить на ваш вопрос, для передового опыта используйте только оператор new или malloc для выделения места.Предполагая, что вы новичок в указателях, большая разница между указателями и ссылками заключается в том, что вы должны использовать явный оператор * оператор-для разыменования указателя, но вы не используете оператор для разыменования ссылки.

0 голосов
/ 08 февраля 2012

Да, я согласен с Джони, синтаксический указатель синтаксически ближе к ссылке в Java.

Другое важное различие между указателем и ссылкой в ​​C ++: указатель может указывать либо на реальный объект, либо он может быть равен нулю. Ссылка в C ++ по определению всегда указывает на реальный объект или переменную. Вы должны назначить это чему-то реальному, когда вы это объявите

0 голосов
/ 08 февраля 2012

В C ++ вы используете указатели, поэтому, если у вас есть:

int foo = 0;

, вы можете иметь указатель , который ссылается на адрес foo с:

int* bar = &foo;

В этой строке кода указано, что значение bar равно адресу foo в памяти.Java манипулирует объектами по ссылке, и каждый объект является ссылкой, но он также собирает мусор автоматически.Если вы используете ключевое слово new в C ++, вам нужно очистить память самостоятельно:

float* f = new float(0);  // Allocate memory
...                       
delete f;                 // Free memory
0 голосов
/ 08 февраля 2012

Нет в Java, когда вы объявляете String s, s не содержит адрес новой String, но его значение, которое в этом случае является чем-то.

Вы можете взглянуть на сообщение this для получения дополнительной информации о расположении переменных адресов в Java, что отчасти бессмысленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...