3 Stimmen

Was ist der Unterschied zwischen einem Java-Verweis und einem C++-Verweis?

Also, ich habe darüber nachgedacht (während ich dieses Java-PDF lese)...

Ich weiß, das mag albern erscheinen, aber warum kann ich das nicht in C++ machen?

float &f = new float;

Heißt das nicht, dass die Referenz von f die Adresse von new float ist?

In Java sehe ich so etwas

String s = new String("something")

String s wird als String-Referenz bezeichnet.

Hat das Wort 'Referenz' in Java die gleiche Bedeutung wie in C++?

14voto

templatetypedef Punkte 343693

Java-Verweise sind C++ Pointern viel näher als C++-Referenzen. In Java können Sie Folgendes mit einem Verweis tun:

  • Ändern, auf welches Objekt es verweist
  • Überprüfen, ob zwei Verweise gleich oder ungleich sind
  • Nachrichten an das referenzierte Objekt senden.

In C++ haben Pointer diese Eigenschaften. Daher ist der Code, den Sie in C++ suchen, etwas wie

float* f = new float;

Was völlig legal ist. Für einen besseren Vergleich, dieser Java-Code:

String myString = new String("Das ist ein String!"); // Normalerweise würde ich hier keinen String zuweisen, aber nur für die parallele Struktur werden wir das tun.
System.out.println(myString.length());

/* Weisen Sie myString zu, um auf ein anderes String-Objekt zu zeigen. */
myString = new String("Hier ist ein weiterer String!");
System.out.println(myString.length());

würde diesem C++-Code entsprechen:

std::string* myString = new std::string("Das ist ein String");
std::cout << myString->length() << std::endl;

delete myString; // Kein GC in C++!

/* Weisen Sie myString zu, um auf ein anderes String-Objekt zu zeigen. */
myString = new std::string("Hier ist ein weiterer String!");
std::cout << myString->length() << std::endl;

delete myString; // Kein GC in C++!

Hoffentlich hilft das!

0voto

user1084509 Punkte 1832

Nein, in Java, wenn Sie String s deklarieren, enthält s nicht die Adresse des neuen Strings, sondern seinen Wert, der in diesem Fall etwas ist.

Sie können sich diesen Beitrag für weitere Informationen über die Speicherorte von Variablen in Java ansehen, was irgendwie bedeutungslos ist.

0voto

Foggzie Punkte 9534

In C++ verwendest du Zeiger, also wenn du hast:

int foo = 0;

dann kannst du einen Zeiger auf die Adresse von foo haben mit:

int* bar = &foo;

Diese Codezeile besagt, dass der Wert von bar die Speicheradresse von foo ist. Java manipuliert Objekte per Referenz und jedes Objekt ist eine Referenz, aber es sammelt auch automatisch Müll. Wenn du das new Schlüsselwort in C++ verwendest, musst du den Speicher selbst aufräumen:

float* f = new float(0);  // Speicher reservieren
...                       
delete f;                 // Speicher freigeben

0voto

larboyer Punkte 109

Ja, ich stimme Joni zu, ein c++ Zeiger ist syntaktisch näher an einer Referenz in Java.

Der andere wichtige Unterschied zwischen einem Zeiger und einer Referenz in C++ ist, dass ein Zeiger entweder auf ein echtes Objekt verweisen kann oder gleich null sein kann. Eine Referenz in C++ zeigt immer auf ein echtes Objekt oder eine echte Variable. Sie müssen es auf etwas Reales verweisen, wenn Sie es deklarieren.

0voto

Frantz Romain Punkte 796

Um Ihre Frage zu beantworten, verwenden Sie am besten nur den new- oder malloc-Operator, um Speicherplatz zuzuweisen. Unter der Annahme, dass Sie neu im Umgang mit Pointern sind, besteht der große Unterschied zwischen Pointern und Referenzen darin, dass Sie einen expliziten Operator - den *-Operator - verwenden müssen, um einen Zeiger zu dereferenzieren, aber Sie verwenden keinen Operator, um eine Referenz zu dereferenzieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X