Was bedeutet diese Aussage? "Gute C ++ - Programmierung verwendet normalerweise keine komplizierten Zeigern."

7

In diese andere Frage in der gewinnenden Antwort las ich:

  

... in der Regel gute C ++ Programmierung   verwendet keine komplizierten Zeiger   Wege.

Was bedeutet es, Zeiger nicht auf komplizierte Weise zu verwenden?

(Ich hoffe wirklich, dass das keine subjektive Frage ist)

    
leeand00 23.05.2017, 11:52
quelle

12 Antworten

7

Als der Typ, der das geschrieben hat, kann ich Ihnen zumindest sagen, was ich meinte.

In einem guten C ++ - Programm, wie ich es kenne, werden Pointer verwendet, um Objekte anzuzeigen, meistens, damit sie weitergegeben und polymorph verwendet werden können. Sie werden nicht verwendet, um als Referenz zu bestehen, denn dafür gibt es Referenzen. Es gibt keine Zeigerarithmetik. Es gibt nicht viele rohe Zeiger. Zeiger werden normalerweise nicht zum Aufbau von Datenstrukturen verwendet, da die meisten Datenstrukturen, die Sie sehr gerne haben möchten, in die Standardbibliothek oder vielleicht Boost integriert sind.

Mit anderen Worten verwendet modernes C ++ typischerweise Zeiger auf die gleiche Weise wie Java, außer dass Java das Wort nicht verwendet, da es kein anderes Konzept als einen primitiven Datentyp hat, auf den mit Ausnahme des Zeigers zugegriffen werden kann (zumindest nicht Ich habe zuletzt Java benutzt. Die Übersetzung stammt von etwas wie Foo bar = new Foo(); (Syntax nicht garantiert) bis smart_ptr<Foo> bar = new Foo; und von bar.snarf() bis bar->snarf() . Zumindest muss ein Java-Programmierer das Konzept nicht so aufnehmen, wie er oder sie es tun würde, wenn er oder sie nach C ziehen würde.

    
David Thornley 09.12.2009, 15:53
quelle
13

Natürlich ist es subjektiv. Einige Leute scheinen fast alle Zeiger als "kompliziert" zu betrachten, während andere sich leicht zwischen drei (oder mehr) Ebenen der Indirektion bewegen, während sie viel rechnen, ohne sich zu verwirren.

    
unwind 09.12.2009 15:07
quelle
7

Ich vermute, dass es einfach bedeutet, keine rohen Zeiger überall zu haben. Zeiger sollten im Allgemeinen innerhalb einer Klasse gehalten werden, die den Zeiger besitzt und für das Löschen des zeigenden Objekts verantwortlich ist (z. B. std :: auto_ptr). Dies macht im Allgemeinen Ihren Code einfacher.

    
jon-hanson 09.12.2009 15:12
quelle
6

Mein Verständnis dieser Antwort ist, dass "modernes" C ++ nicht viel von Zeigern benötigt, da die meisten Datenstrukturen, die Sie verwenden, bereits entweder in Boost oder der Standardbibliothek eingebaut sind.

So "komplizierte Wege" der Verwendung von Zeigern wäre von Zeigern zu Zeigern und Struktur Traversal mit Zeigern zu wirklich komplizierte und potenziell unsichere Möglichkeiten der Verwendung von Zeigern, wie Zeiger Mathematik oder schlechter.

Ich persönlich denke, dass es darauf ankommt, welchen Code du schreibst. Es gibt eine Menge Code, der Ad-hoc-Datenstrukturen schreiben muss, also würde ich diesen Satz mit einer Prise Salz nehmen.

    
Vinko Vrsalovic 09.12.2009 15:11
quelle
2

Diese Aussage macht keinen Sinn, da Zeiger in C ++ nicht auf komplizierte Weise verwendet werden können.

%Vor%

... Entet und rennt weg ...

    
hirschhornsalz 09.12.2009 17:16
quelle
1

wenn die betreffenden Zeiger

sind

1) werden nur als Referenzen auf Heap-Speicherblöcke verwendet.

2) Der fragliche Zeiger existiert nur an einer Stelle.

2.1) Wenn sie im Stack sind, verwenden sie einen Smart-Pointer, der außerhalb des Geltungsbereichs liegt (oder werden am Ende des Bereichs manuell gelöscht).

2.2) Wenn sie zu einer Klasse gehören, werden die korrekten vom Compiler erzeugten Member-Funktionen definiert.

Als würde ich sagen, dass sie auf eine vernünftige und unkomplizierte Weise verwendet werden: D

    
Hassan Syed 09.12.2009 15:35
quelle
1

Zeiger sind nicht das Problem. Die Anweisung ist eine Version der allgemeineren Aussage, dass ein Programm nichts kompliziertes tun sollte. Das Wesentliche beim Entwerfen eines Programms ist das Entfernen von Komplexität.

"Dummköpfe ignorieren die Komplexität; Pragmatiker leiden darunter; Experten meiden es; Genies entfernen es." (Alan Perlis)

"Jeder intelligente Narr kann Dinge größer, komplexer und gewalttätiger machen. Es erfordert einen Hauch von Genialität - und viel Mut - sich in die entgegengesetzte Richtung zu bewegen." (Albert Einstein)

    
William Pursell 09.12.2009 17:04
quelle
1

Ab C ++ - Programmierer oder Leute, die aus Java oder C # kommen, verwenden Pointer überall .

Sie brauchen ein Objekt vom Typ Foo? %Code%. Die Klasse Foo* f = new Foo(); enthält ein Member-Objekt? Machen Sie das zu einem Zeiger auf ein dynamisch zugewiesenes Objekt.

Und das ist nicht der richtige Weg. Das Objekt Bar kann auf dem Stapel zugeordnet werden. Sie müssen keine dynamische Zuweisung verwenden, und Sie müssen keinen Zeiger verwenden. Foo kann das Elementobjekt direkt speichern, anstatt einen Zeiger darauf.

In gutem C ++ - Code sollten Zeiger selten sein. Nicht weil das Entfernen von Zeigern den Code verbessert, sondern weil ein starker Gebrauch von Zeigern ein Zeichen dafür ist, dass die Person, die den Code geschrieben hat, die Sprache Java oder C # vorgibt.

Andere Beispiele beruhen auf Arrays und Zeigern, bei denen Bar das Problem gelöst hätte. Oder die Verwendung von Zeigern zur Implementierung von Verweis-zu-Verweis, wenn tatsächliche Referenzen verwendet werden könnten.

    
jalf 09.12.2009 19:44
quelle
0

Nun ja, natürlich ist es subjektiv - eine Person ist "kompliziert" ist eine andere "so einfach, ich kann es tun, wenn ich schlafe". Für eine etwas andere Sichtweise, wie wäre es mit dem Gedanken, überhaupt Zeiger zu verwenden, und warum sollte man das tun? Sie können auch über die Wartbarkeit des Codes nachdenken. Die Frage, von der Sie das Zitat erhalten haben, erwähnt die Einstellung der letzten Absolventen - wenn eine Organisation die Angewohnheit hat, Leute einzustellen, die keine Erfahrung mit Zeigern haben, dann wird in dieser Organisation guter C ++ Code keine extensive Verwendung von Zeigern haben.

    
Liz Albin 09.12.2009 15:28
quelle
0

Verwenden Sie Zeiger, wo Sie müssen, aber nirgendwo sonst.

    
DevSolar 09.12.2009 15:38
quelle
0

Es bedeutet, dass die Verwendung von Zeigern für den Leser natürlich offensichtlich ist . Was genau das bewirkt, hängt vom gegebenen System ab.

Für viele Leute haben sie nicht die erforderliche Erfahrung und Expertise, um komplexe Probleme bei der Entwicklung auf Speicherebene (Debugger, Kernel, Treiber usw.) zu lösen. Diese Domäne erfordert das Verstehen des Zeigers - oder, besser gesagt, das Verstehen dessen, was eine Zeigerlösung am offensichtlichsten macht.

Die meisten Probleme erfordern keine Lösungen auf Speicherebene; daher die Verwendung von Java, Haskell, C # und anderen Unpointer-Sprachen.

    
Paul Nathan 09.12.2009 20:21
quelle
0

Ich möchte von der ursprünglichen Behauptung abweichen. Das Problem ist keine Komplikation, es ist Verkapselung vs Kopplung. Gute C ++ - Programme kapseln Zeiger innerhalb von Klassen ein, die den einzigen Zweck haben, die Zeiger zu verwalten, die Invarianten zu erhalten und die Verwendung von Zeigern zu verhindern, die ungültig geworden sind (z.B. durch Iteration vom Ende eines Feldes). In der Klasse kann eine Vielzahl von Schwerpunktrechnungen ausgeführt werden, um verknüpfte Listen, Hashtabellen, Compare-and-Swap, Softwaretransaktionsspeicher mit ACID-Semantik usw. bereitzustellen, aber alle Benutzer sind gegen solche Implementierungsdetails geschützt. Und die Zeigermathematik wird nicht durch Programmlogik kompliziert, diese Dinge werden woanders gemacht.

    
Ben Voigt 09.12.2009 22:06
quelle

Tags und Links