Warum sollte ich auf Variablen verweisen?
Als meine erste Programmiersprache, die ich gelernt Java, da ich aber geändert, um eine andere Universität, ich bin jetzt lernen C++.
Kommen von Java und erlernen die Grundlagen von C++ habe ich gelesen, Referenzen und Referenzvariablen. Und wie gefährlich Sie sein können und wie werden Sie vorsichtig mit Ihnen und so weiter.
So, in meinem Kopf entsteht eine einfache Frage:
Warum sollte ich mir die Mühe mit dieser Art von komplizierten und daher potentiell problem verursacht, den Kram überhaupt?
Ist es irgendwie Wert, oder nur ein Relikt aus den Zeiten, wo RAM noch über 64 MB groß?
Da eine Menge Antworten haben, die genannten Zeiger: Das Konzept ist klar aus der Steinzeit, imho. Außer für high-performance-Berechnung würde ich nicht Anfassen, das Zeug.
Was Sie sich stellen sollten ist vielmehr: Nun, ich habe Referenzen, deshalb brauche ich Hinweise? (By the way, Referenzen und smart-Pointer sind mehr wie Ihre Java-Pendants, als die normalen Zeiger).
Neben call-by-value, Sie hatte nur Referenzen in java.
Können Sie uns ein Beispiel geben von denen Sie denken, eine Referenz ist eine schlechte Idee, während Sie denken, dass etwas anderes (und sagen, was ist besser?
Versuchen zu lernen, C++, durch einen filter von Java verstehen, ist eine schlechte Idee. Versuchen zu vergessen alles, was Sie wissen über Java. Sie können nicht zu schätzen wissen, dass Java verwechseln rutschen in die Zeiger beim übergeben von Objekten. In C++ ist alles transparent.
InformationsquelleAutor kwoebber | 2012-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist nicht das die sich auf Referenzen beziehen sich.
Das problem ist, dass in C++, object lifetime wird anders gehandhabt als in Java oder anderen run-time-Umgebungen verwenden einen garbage collector. C++ nicht-standard-built-in-garbage-collector. C++ - Objekt-Lebensdauer automatisch (innerhalb von lokalen oder globalen Gültigkeitsbereich) oder manuell (explizit zugewiesen/freigegeben in heap).
Einer C++ - Referenz ist nur ein einfacher alias für ein Objekt. Es weiß nichts über die Lebensdauer von Objekten (aus Gründen der Effizienz). Der Programmierer muss sich darum kümmern. Eine Ausnahme ist der spezielle Fall, wo eine Referenz gebunden ist, um ein temporäres Objekt, in diesem Fall ist die Lebensdauer des temporären verlängert die Lebensdauer des gebundenen Referenz. Details sind hier.
Referenzen sind ein wichtiger Bestandteil von C++ grundlegende Konzepte und man kann nur vermieden werden, dass Sie für 90% der Aufgaben. Ansonsten musst du Zeiger verwenden, die in der Regel noch schlimmer 🙂
E. g., wenn Sie brauchen, um passieren Objekt als Funktion argument durch Verweis statt von Wert Sie können Referenzen verwenden:
rather
alsvalue
?in den meisten Fällen ja. Vorbei Objekt von Wert führt zu macht-Objekt kopieren, das kann teuer werden, im Fall von großen Objekten und/oder nicht-trivialer Objekt-copy-ctor/assignment-operator. Übergabe Objekt-Referenz führt zum kopieren der Zeiger nur.
Weiß nicht, über Leben... es sei denn, es verlängert die Lebensdauer.
InformationsquelleAutor Rost
Wenn Sie große Objekte als Funktion, die Parameter by value), könnte es eine sehr Reale performance-drop ist dieses Problem gelöst, indem Sie als Referenzen. Sie können auch ändern, die Objekte innerhalb von Funktionen, wenn Sie an Ihnen Vorbeigehen Referenz statt Wert.
Und cpp-next.com/archive/2009/08/want-speed-pass-by-value
InformationsquelleAutor SurvivalMachine
Eine Referenz ist ein Zeiger mit Einschränkungen. Eine Referenz ist eine Art Zugriff auf ein Objekt, aber nicht das Objekt selbst. Wenn es Sinn macht, für Ihren code verwenden, diese Einschränkungen, dann über eine Referenz statt Zeiger können compiler zu warnen, Sie über die Sie versehentlich zu verletzen.
InformationsquelleAutor robrochta
Als Sie kam gerade von Java, ich kann mir vorstellen, Sie haben Probleme mit einer Vielzahl von gefährlich Sachen, die C/C++ können Sie das tun. Meiner Meinung nach, der Unterschied ist hier:
Was Sie nicht mag ("Zeiger/Referenzen sind gefährlich") ist genau das, was ich Liebe ("es lässt mich tun eine Menge Dinge, und wenn ich Durcheinander es ist meine Schuld") über C++. Es ist eine Frage der Programmiersprache Geschmack, meiner Meinung nach.
Referenzen gemacht wurden, zu vermeiden einige Gefahren von Pointern, aber auf der anderen Seite, auch die Zeiger noch verwendet neben den offensichtlichen schnellen Zugriff Zeug. Zum Beispiel, sagen wir, Sie haben ein low-level-Objekt, die einige nützliche Arbeit und verteilt sich auf mehr als eine high-level-Objekte. Es kann geteilt werden, die aus verschiedenen Gründen (z.B. es aktualisiert den internen Zustand jeder Zeit, es tut nützliche Arbeit so zu kopieren ist keine option).
Über Referenzen in diesem Fall erzwingt die Initialisierung der internen
object
. Wenn auf der anderen Seite, die Funktionalität, die das Objekt bietet, ist nur optional für die high-level-Objekt, als der Zeiger ist ein Weg zu gehen:Auch, für die Nutzung der call-by-reference, das sind die meisten nützlich, wenn Sie vorbei sind eine große Struktur an eine Funktion, z.B.
vector<int>
.InformationsquelleAutor penelope
Die eigentliche Frage ist "warum die Verwendung von Referenzen anstelle von Zeigern".
Ich habe noch nicht ganz herausgefunden noch. Zur Zeit benutze ich Verweise
da kann man nicht zuweisen. Schlimmsten Fall bedeutet das nichts für den compiler, aber da ist die chance, dass der compiler kann dieses wissen.
oft, wenn ich zurückkehren möchten einen Zeiger, der immer vorhanden ist, oder anzeigt, dass ein parameter erforderlich ist, und kann nicht ein nullptr (es gibt keine null-Referenz). Es ist keine Feste Regel, manchmal eine tatsächliche Zeiger natürlicher wirkt.
wenn etwas Fragen Sie nach Referenzen, wie operator-überladung.
In der Regel habe ich am Ende mit einer Menge von Referenzen, da ich in der Regel nicht zu kopierenden Objekte, es sei denn, ich brauche wirklich eine tatsächliche Kopie, und die Verweise funktionieren oft.
InformationsquelleAutor Christian Stieber
Referenzen call-by-reference einfacher, da der Aufrufer nicht über die Verwendung der
&
Betreiber, wenn passinng ein Objekt.Wie diese:
Weiters ermöglichen Sie die Initialisierung von Zeigern an eine Funktion:
Ohne die Referenz auf Zeiger in diesem Beispiel würde nur mit einem Zeiger auf Zeiger, so dass der code schrecklich Aussehen, als müsste man derefernce jedes argument zunächst
InformationsquelleAutor TeaOverflow
Ist die häufigste Verwendung von Referenzen zu vermeiden, ein teures Tiefe Kopie;
standardmäßig C++ hat den Wert-Semantik, und wenn Sie etwas schreiben wie:
Der ganze vector kopiert werden jedes mal, wenn Sie aufrufen
f
. So schreiben Sieso etwas wie:
Einem Ort, wo dies besonders wichtig ist bei der Definition eines copy-Konstruktors. Wenn Sie schreiben:
Sie würde am Ende mit einer unendlichen Rekursion, da der compiler würde
rufen Sie der copy Konstruktor, um zu kopieren Sie das argument in diesem Konstruktor. (In der Tat, der compiler akzeptiert nur einen Konstruktor
die einen Verweis auf die Kopie-Konstruktor, genau dies zu vermeiden
problem.)
Außerhalb von Konstruktoren, das ist wirklich eine Optimierung und könnte
als vorzeitige Optimierung. In der Praxis werden jedoch fast
universal-convention ist vorbei, Klasse Typen per Referenz zu const,
anstatt von Wert.
Referenzen können auch verwendet werden als out-Parameter; im Vergleich zu einem Zeiger,
Sie haben den Vorteil, dass Sie nicht null sein.
Referenzen können auch verwendet werden, um ein "Fenster" in der Klasse.
Das klassische Beispiel dafür ist die überlastung der
operator[]
imstd::vector
;es gibt einen Verweis, so dass Sie ändern können, nehmen Sie sich die Adresse von etc.
das aktuelle element im array.
Andere als Parameter und Rückgabewerte, die in den oben genannten Fällen,
Referenzen sind eher selten. Wenn Sie einen als Schüler, für
Beispiel, müssen Sie sich bewusst sein, dass Sie nicht geben kann die Klasse Klassik
die Zuordnung der Semantik. (Dies ist nicht ein Problem, wenn die Klasse nicht
Unterstützung der Zuordnung.) Als eine Globale variable haben, könnten Sie zum ausblenden verwendet werden
die Umsetzung von dem, was bezeichnet wird, aber dies ist überaus
selten. Wie eine lokale variable, die nur ich wissen, ist cache die
die Ergebnisse der anderen Ausdruck gibt eine Referenz: wenn zum Beispiel
Ich bin Zugriff auf
someMap[aKey]
eine große Anzahl von Zeiten in einem kurzen blockder code, macht es Sinn, zu schreiben:
am start, und verwenden Sie
element
nach. (Beachten Sie, dass diese macht nurSinn, weil
someMap[aKey]
gibt einen Verweis.)InformationsquelleAutor James Kanze
Zum Beispiel, weil Sie Sie zu zwingen, initialze, das macht Sie weniger gefährlich
InformationsquelleAutor ISTB