[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/wiki10\/2020\/12\/25\/referenz-c-wikipedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/wiki10\/2020\/12\/25\/referenz-c-wikipedia\/","headline":"Referenz (C ++) – Wikipedia","name":"Referenz (C ++) – Wikipedia","description":"before-content-x4 In der Programmiersprache C ++ a Referenz ist ein einfacher Referenzdatentyp, der weniger leistungsf\u00e4hig, aber sicherer als der von","datePublished":"2020-12-25","dateModified":"2020-12-25","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/wiki10\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/wiki10\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":100,"height":100},"url":"https:\/\/wiki.edu.vn\/wiki10\/2020\/12\/25\/referenz-c-wikipedia\/","wordCount":2834,"articleBody":" (adsbygoogle = window.adsbygoogle || []).push({});before-content-x4In der Programmiersprache C ++ a Referenz ist ein einfacher Referenzdatentyp, der weniger leistungsf\u00e4hig, aber sicherer als der von C geerbte Zeigertyp ist. Der Name C ++ – Referenz kann Verwirrung stiften, da in der Informatik eine Referenz ein allgemeiner Konzeptdatentyp ist, mit Zeiger und C ++ – Referenzen als spezifische Referenzdatentypimplementierungen. Die Definition einer Referenz in C ++ ist so, dass sie nicht existieren muss. Es kann als neuer Name f\u00fcr ein vorhandenes Objekt implementiert werden (\u00e4hnlich wie beim Umbenennen des Schl\u00fcsselworts in Ada). (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Table of ContentsSyntax und Terminologie[edit]Beziehung zu Zeigern[edit]Verwendung von Referenzen[edit]Polymorphes Verhalten[edit]ISO-Definition[edit]Externe Links[edit]Verweise[edit]Syntax und Terminologie[edit]Die Erkl\u00e4rung des Formulars:& wo ist ein Typ und ist eine Kennung, deren Typ ist Bezug auf . (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Beispiele:int a = 5;int& r_a = a;extern int& r_b;Hier, r_a und r_b sind vom Typ “Verweis auf int“”Foo ist eine Funktion, die einen “Verweis auf” zur\u00fcckgibt int“”Bar ist eine Funktion mit einem Referenzparameter, der eine “Referenz auf” ist int“” (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4class MyClass { int& m_b; \/* ... *\/ };MyClass ist ein class mit einem Mitglied, auf das Bezug genommen wird intint FuncX() { return 42 ; };int (&f_func)() = FuncX;FuncX ist eine Funktion, die einen (Nichtreferenztyp) zur\u00fcckgibt. int und f_func ist ein alias zum FuncXconst int& ref ist eine konstante Referenz, die auf ein Speicherst\u00fcck mit dem Wert 65 zeigt.Typen, auf die “Bezug genommen wird” “werden manchmal genannt Referenztypen. Bezeichner vom Referenztyp werden aufgerufen Referenzvariablen. Um sie anzurufen Variableist jedoch in der Tat eine Fehlbezeichnung, wie wir sehen werden.Beziehung zu Zeigern[edit]C ++ – Referenzen unterscheiden sich von Zeigern in mehreren wesentlichen Punkten:Es ist nicht m\u00f6glich, direkt auf ein Referenzobjekt zu verweisen, nachdem es definiert wurde. Jedes Vorkommen seines Namens bezieht sich direkt auf das Objekt, auf das er verweist.Sobald eine Referenz erstellt wurde, kann sie sp\u00e4ter nicht mehr als Referenz f\u00fcr ein anderes Objekt verwendet werden. es kann nicht sein wieder eingesetzt. Dies geschieht h\u00e4ufig mit Zeigern.Referenzen k\u00f6nnen nicht sein Null, w\u00e4hrend Zeiger k\u00f6nnen; Jede Referenz bezieht sich auf ein Objekt, obwohl es g\u00fcltig sein kann oder nicht. Beachten Sie, dass aus diesem Grund Referenzcontainer nicht zul\u00e4ssig sind.Referenzen k\u00f6nnen nicht nicht initialisiert werden. Da es unm\u00f6glich ist, eine Referenz neu zu initialisieren, m\u00fcssen sie sofort nach ihrer Erstellung initialisiert werden. Insbesondere m\u00fcssen lokale und globale Variablen dort initialisiert werden, wo sie definiert sind, und Referenzen, die Datenelemente von Klasseninstanzen sind, m\u00fcssen in der Initialisierungsliste des Konstruktors der Klasse initialisiert werden. Zum Beispiel:int& k; \/\/ compiler will complain: error: `k' declared as reference but not initializedEs gibt eine einfache Konvertierung zwischen Zeigern und Referenzen: die Adresse des Operators (&) ergibt einen Zeiger, der sich auf dasselbe Objekt bezieht, wenn er auf eine Referenz angewendet wird, und eine Referenz, die aus der Dereferenzierung initialisiert wird (*) eines Zeigerwerts bezieht sich auf dasselbe Objekt wie dieser Zeiger, wobei dies m\u00f6glich ist, ohne undefiniertes Verhalten aufzurufen. Diese \u00c4quivalenz spiegelt die typische Implementierung wider, bei der Referenzen effektiv zu Zeigern zusammengefasst werden, die bei jeder Verwendung implizit dereferenziert werden. Obwohl dies normalerweise der Fall ist, zwingt der C ++ – Standard Compiler nicht dazu, Referenzen mithilfe von Zeigern zu implementieren.Dies hat zur Folge, dass in vielen Implementierungen das Bearbeiten einer Variablen mit automatischer oder statischer Lebensdauer \u00fcber eine Referenz, obwohl syntaktisch dem direkten Zugriff \u00e4hnlich, versteckte Dereferenzierungsoperationen beinhalten kann, die kostspielig sind.Da die Operationen f\u00fcr Referenzen so begrenzt sind, sind sie viel einfacher zu verstehen als Zeiger und widerstandsf\u00e4higer gegen Fehler. W\u00e4hrend Zeiger durch eine Vielzahl von Mechanismen ung\u00fcltig gemacht werden k\u00f6nnen, angefangen beim \u00dcbertragen eines Nullwerts \u00fcber unregelm\u00e4\u00dfige Arithmetik bis hin zu illegalen Casts und deren Erzeugung aus beliebigen Ganzzahlen, wird eine zuvor g\u00fcltige Referenz nur in zwei F\u00e4llen ung\u00fcltig:Wenn es sich um ein Objekt mit automatischer Zuordnung handelt, das au\u00dferhalb des G\u00fcltigkeitsbereichs liegt,Wenn es sich auf ein Objekt in einem freigegebenen Block des dynamischen Speichers bezieht.Die erste ist leicht automatisch zu erkennen, wenn die Referenz einen statischen G\u00fcltigkeitsbereich hat, ist jedoch immer noch ein Problem, wenn die Referenz Mitglied eines dynamisch zugewiesenen Objekts ist. Der zweite ist schwieriger zu erkennen. Dies sind die einzigen Bedenken in Bezug auf Referenzen und werden durch eine angemessene Zuweisungsrichtlinie angemessen ber\u00fccksichtigt.Verwendung von Referenzen[edit]Abgesehen von einem hilfreichen Ersatz f\u00fcr Zeiger besteht eine bequeme Anwendung von Referenzen in Funktionsparameterlisten, in denen die f\u00fcr die Ausgabe verwendeten Parameter ohne explizite Adress\u00fcbernahme durch den Aufrufer \u00fcbergeben werden k\u00f6nnen. Zum Beispiel:void Square(int x, int& out_result) { out_result = x * x;}Dann w\u00fcrde der folgende Anruf 9 in platzieren y::Der folgende Aufruf w\u00fcrde jedoch einen Compilerfehler ergeben, da Referenzparameter nicht mit qualifiziert sind const kann nur an adressierbare Werte gebunden werden:Durch die R\u00fcckgabe einer Referenz k\u00f6nnen Funktionsaufrufe zugewiesen werden:int& Preinc(int& x) { return ++x; \/\/ \"return x++;\" would have been wrong}Preinc(y) = 5; \/\/ same as ++y, y = 5In vielen Implementierungen implizieren normale Parameter\u00fcbergabemechanismen h\u00e4ufig eine teure Kopieroperation f\u00fcr gro\u00dfe Parameter. Referenzen qualifiziert mit const sind eine n\u00fctzliche Methode zum \u00dcbergeben gro\u00dfer Objekte zwischen Funktionen, die diesen Overhead vermeidet:void FSlow(BigObject x) { \/* ... *\/ } void FFast(const BigObject& x) { \/* ... *\/ }BigObject y;FSlow(y); \/\/ Slow, copies y to parameter x.FFast(y); \/\/ Fast, gives direct read-only access to y.Wenn FFast erfordert tats\u00e4chlich eine eigene Kopie von x Damit es ge\u00e4ndert werden kann, muss es explizit eine Kopie erstellen. W\u00e4hrend die gleiche Technik unter Verwendung von Zeigern angewendet werden k\u00f6nnte, w\u00fcrde dies das \u00c4ndern jeder Aufrufstelle der Funktion beinhalten, um eine umst\u00e4ndliche Adresse von (&) Operatoren auf das Argument und w\u00e4re ebenso schwer r\u00fcckg\u00e4ngig zu machen, wenn das Objekt sp\u00e4ter kleiner w\u00fcrde.Polymorphes Verhalten[edit]In Fortsetzung der Beziehung zwischen Referenzen und Zeigern (im C ++ – Kontext) weisen die ersteren polymorphe F\u00e4higkeiten auf, wie zu erwarten:#include class A { public: A() = default; virtual void Print() { std::cout (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4"},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki10\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki10\/2020\/12\/25\/referenz-c-wikipedia\/#breadcrumbitem","name":"Referenz (C ++) – Wikipedia"}}]}]