C++ - Referenz & const-Zeiger in C/C++
Kürzlich, während ich ihm erklärte, dass der grundlegende Unterschied zwischen Zeiger und Referenzen(in Zusammenhang mit C++ - Programmierung) zu jemandem, sagte ich die üblichen Erklärungen, die reden andere Funktion als argument übergeben Konventionen - Call-by-value, Call by pointer, Call-by-reference, und alle damit verbundenen Theorie über Referenzen.
Aber dann dachte ich, was ein C+ Referenz wird in Bezug auf die übergabe von Argumenten,(Ermöglicht eine Speicher-effiziente Weg, vorbei an großen Strukturen/Objekte zur gleichen Zeit hält Sie sicher, indem nicht der angerufene um die änderung der Variablen des übergebenen Objekts als Referenz, wenn unsere design-Anforderungen)
Einen const-Zeiger in C erreichen würde, die gleiche Sache , z.B. Wenn man muss eine Struktur, die pointer sagen struct mystr *ptr, durch Gießen der Struktur-pointer als konstant -
func(int,int,(const struct mystr*)(ptr));
wird ptr nicht eine Art äquivalent zu einer Referenz?
-
Wird es nicht funktionieren, in der Art, was wäre, Speicher effizient, indem Sie nicht die Replikation der Struktur(pass-pointer), sondern auch sicher durch das Verbot jeglicher Veränderungen, um die Felder der Struktur aufgrund der Tatsache, dass es übergeben wird, da ein const-Zeiger.
In C++ - Objekt-Kontext, wir übergeben, auf const-Objekt Zeiger anstelle des Objekts als Referenz gleicher Funktionalität)
-
Wenn ja, dann was verwenden-case-Szenario in C++, braucht Referenzen.
Alle spezifischen Vorteile von Referenzen und die damit verbundenen Nachteile?
danke.
-AD
- Wie werden Zeiger weniger "type-safe" als Referenzen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei typische Anwendungsfälle:
Erste: Zeiger (Pointer) zeigen optionale Argumente an. Da Referenzen nicht
NULL
, sondern Zeiger (Pointer können, dokumentieren Sie in der coding-Stil, der jedes argument, das notiert als Zeiger, kannNULL
muss die Funktion handle. Optionale Argumente können dann const oder non-const, so kann obligatorisch (Referenz -) Argumente.Zweite: - Referenzen sind nur in Verbindung mit dem Schlüsselwort const, da die Aufruf-syntax suggeriert dem Leser pass-by-value-Semantik, die ist per definition konstant. Dann die Zeiger sind nur für die Argumente, die geändert werden können, indem der angerufene.
Ich persönlich bevorzuge die erste option, da jedem der vier Fälle "const-Referenz", "non-const-reference", "const" pointer", "non-const-Zeiger" hat eine andere Bedeutung. Option nur zwei unterscheidet zwischen zwei "Dinge": "Funktion ändern kann, der Wert" vs. "Funktion nicht ändern, dass Wert".
NULL
in der Tat ist nicht ein gravierender Fehler bei der Programmierung. Dummes Beispiel: Sie möchten protokollieren, geben Sie einen nicht-null-logger-Funktion. Weniger albern (aber C-Bibliothek) - Beispiel: sigprocmask. Wo ist es ein Fehler zu gebenNULL
, die Funktion sollte einen Verweis in den ersten Platz. Ja, das bedeutet, dass die meisten Funktionen nur Referenzen (oder Wert, wenn das opportun ist).Können Sie binden eine const-Referenz auf einen rvalue:
Aber ist es unmöglich, übergeben Sie die Adresse ein rvalue:
Referenzen wurden eingeführt in die Sprache zur Unterstützung von operator-überladung. Sie wollen in der Lage sein zu sagen
a - b
, nicht&a - &b
. (Beachten Sie, dass die letzteren bereits eine Bedeutung hat: Zeiger-Subtraktion.)Verweise in Erster Linie Unterstützung Verweis übergeben, Zeiger in Erster Linie Unterstützung Referenz-Semantik. Ja ich weiß, die Unterscheidung ist nicht immer ganz klar in C++.
null
Referenz. Also, wennnull
ist eine gültige option, verwenden Sie einen Zeiger zu verwenden, ansonsten eine Referenz.In Bezug auf das Bezugsobjekt, was code manipulieren können, gegeben eine const-Referenz ist die gleiche wie das, was Sie tun können, mit einem Zeiger auf ein const-Objekt, und ebenso, was es manipulieren kann, erhält ein nicht-const-Referenz ist die gleiche wie angegeben einen Zeiger auf non-const-Objekt.
Was für eine Referenz wird verhindert, dass die aufgerufene Funktion zu tun, verändert sich das Objekt der Referenz sich bezieht, oder Zeiger-Arithmetik auf die Referenz.
In Bezug auf den Anrufer, eine const-Referenz gebunden werden können, die direkt zu einem rvalue, und Sie haben gut definierte Semantik beim erstellen und zerstören von Objekten als Argumente übergeben wurden. Dies ist ein gemeinsames idiom zu konstruieren, eine temporäre für ein argument:
Aber es ist nicht sofort offensichtlich, dass die Foo-Objekt in diese hat eine Lebensdauer, die über die Länge des Funktionsaufrufs:
Obwohl natürlich die letzteren, die nur ein Funktionsaufruf, sollte klar machen, das tut es.
Grundsätzlich der Verweise sind syntaktischer Zucker für Zeiger, die auf einzelne Objekte, nicht den Anfang des arrays.