Beginnend Programmierung mit C ++ für Dummies

C ++ ist voll von kleinen Symbole, von denen jede auf die Bedeutung der Ausdrücke hinzufügt. Die Regeln von C ++ Grammatik sind so flexibel, dass diese Symbole in fast unübersichtliches Kombinationen kombiniert werden können. Ausdrücke in der einfacheren Sprache C kann so stumpf bekommen, dass es verwendet wird für einen jährlichen Wettbewerb zu sein, die das dunkelste Programm schreiben könnte, und wer es verstehen konnte.

Es ist nie eine gute Idee, um zu versuchen, komplexen Code zu schreiben, aber Sie werden manchmal über Ausdrücke in C ++ ausführen, die ein wenig verwirrend auf den ersten Blick sind. Verwenden Sie einfach die folgenden Schritte, um sie, um herauszufinden:

  1. Beginnen Sie an den meisten Embedded-Klammern.

    Starten Sie für die äußeren meisten Klammern suchen. Innerhalb diejenigen, suchen Sie nach eingebetteten Klammern. Wiederholen Sie den Vorgang, bis Sie Ihren Weg in die tiefste Klammerpaar gearbeitet habe. Beginnen Sie, dass subexpression Auswertung zunächst die folgenden Regeln. Sobald Sie diesen Ausdruck verstehen, Pop, den Prozess zurück, um die nächste Stufe und wiederholen.

  2. Innerhalb des Klammernpaar, zu bewerten jede Operation in der Rangfolge.

    Die Reihenfolge, die Operatoren ausgewertet werden durch den Bediener der Vorrang in der Tabelle gezeigt bestimmt. Indirection kommt vor der Multiplikation, die somit vor der Zugabe kommt folgendes hinzufügt 1 plus 2 mal der Wert bei mit * ptr zeigt.

int i = 1 + 2 * * ptr-
Operatoren in der Reihenfolge der Präzedenz
VorrangOperatorBedeutung
1() (Einstellige)Aufrufen einer Funktion
2* Und -> (einstellige)Dereference einen Zeiger
2- (Einstellige)Gibt die negativen ihres Arguments
3++ (Einstellige)Zuwachs
3-- (Einstellige)Decrement
4* (Binär)Multiplikation
4/ (Binär)Aufteilung
4% (Binär)modulo
5+ (binär)Zusatz
5- (binär)Subtraktion
6 (binär)Logisches UND
6!!Logisches ODER
7=, * =,% =, + =, - = (Sonder-)Zuordnungsarten
  1. Bewerten Sie Vorgänge der gleichen Priorität von links nach rechts (mit Ausnahme Zuordnung, die in die andere Richtung geht).

    Die meisten Betreiber von gleicher Priorität auswerten von links nach rechts. Somit folgende addiert 1 zu 2 und addiert das Ergebnis zu 3:

    int i = 1 + 2 + 3 

    Die Reihenfolge der Bewertung einiger Betreiber keine Rolle spielt. Zum Beispiel arbeitet zusätzlich dasselbe von links nach rechts, wie es von rechts nach links macht. Die Reihenfolge der Auswertung macht einen großen Unterschied für einige Operationen wie Division. Die folgenden Gräben 8 durch 4 und teilt das Ergebnis durch 2:

    i = int 04.08 / 2-

    Die wichtigste Ausnahme von dieser Regel ist Zuordnung, die von rechts nach links ausgewertet wird:

    a = b = c-

    Dies weist c zu b und das Ergebnis ein.

  2. Bewerten Sie Teilausdrücke in keiner bestimmten Reihenfolge.

    Betrachten Sie den folgenden Ausdruck:

    int i = f () + g () * h () -

    Die Multiplikation eine höhere Priorität hat, so dass man davon ausgehen kann, dass die Funktionen g () und h () vor f genannt werden (), dies ist jedoch nicht der Fall. Funktionsaufruf hat die höchste Priorität von allen, so dass alle drei Funktionen aufgerufen werden, bevor entweder die Multiplikation oder die Zugabe durchgeführt wird. (Die zurückgegebenen Ergebnisse von g () und h () multipliziert und dann zu den Ergebnissen f () zurückgegeben.)

    Das einzige Mal, dass die Ordnung, die Funktionen aufgerufen werden, einen Unterschied macht, ist, wenn die Funktion Nebenwirkungen, wie eine Datei oder ein Ändern des Werts einer globalen Variablen Öffnung aufweist. Sie sollten auf jeden Fall nicht Ihre Programme schreiben, so dass sie sich auf diese Art von Nebenwirkungen ab.

  3. Führen Sie alle Typkonvertierungen nur bei Bedarf.

    Sie sollten nicht mehr Typkonvertierungen als unbedingt notwendig zu machen. Zum Beispiel hat der folgende Ausdruck mindestens drei und möglicherweise vier Typkonvertierungen:

    float f = a + 1-

    Die Zeichen 'a' muss in einen int gefördert werden, um die Addition auszuführen. Die int wird dann einem Doppel umgewandelt und dann auf eine einzige Präzisions float umgewandelt. Denken Sie daran, dass alle Arithmetik durchgeführt wird, entweder in int oder double. Sie sollten in der Regel die Durchführung Arithmetik auf Charaktertypen zu vermeiden und mit einfacher Genauigkeit Schwimmer ganz zu vermeiden.

5 Wege Pointer Probleme in C ++ zu vermeiden

In C ++ ein Zeiger ist eine Variable, die die Adresse eines Objekts in dem Computer des internen Speicher enthält. Verwenden Sie diese Schritte, um Probleme mit Zeigern in C ++ zu vermeiden:

  1. Initialisieren Zeiger, wenn erklärt.

    Nie Zeigervariablen nicht initialisierte verlassen - Dinge wäre nicht so schlimm, wenn nicht initialisierten Zeiger immer Zufallswerte enthalten sind - die überwiegende Mehrheit der Zufallswerte sind illegal Zeigerwerte und führt dazu, dass das Programm zum Absturz zu bringen, sobald sie verwendet werden. Das Problem ist, dass nicht initialisierte Variablen sind in der Regel auf den Wert der anderen, zuvor verwendeten Zeigervariablen zu übernehmen. Diese Probleme sind sehr schwer zu debuggen.

    Wenn Sie nicht wissen, was sonst ein Zeiger zu initialisieren, zu initialisieren, es zu nullptr. nullptr garantiert eine illegale Adresse.

  2. Null aus Zeiger, nachdem Sie sie verwenden.

    In ähnlicher Weise Null immer eine Zeigervariable, wenn der Zeiger nicht mehr gültig ist, indem sie den Wert zuweisen nullptr. Dies ist insbesondere dann der Fall, wenn Sie einen Speicherblock auf dem Heap zurückgeben immer Null über den Zeiger Lösch- nach Heap-Speicher zurück.

  3. Reservieren Sie Speicher aus dem Heap und wieder in den Haufen auf dem gleichen "Ebene" Speicherlecks zu vermeiden.

    Immer versuchen, einen Speicherblock auf dem Heap auf dem gleichen Niveau der Abstraktion zurück, wie Sie es zugeordnet. Dies bedeutet im Allgemeinen versucht, den Speicher auf dem gleichen Niveau von Funktionsaufrufen zu löschen.

  4. Fangen Sie eine Ausnahme Speicher zu löschen, wenn nötig.

    Vergessen Sie nicht, dass eine Ausnahme zu fast jeder Zeit auftreten können. Wenn Sie beabsichtigen, die Ausnahme zu fangen und Betriebs weiterhin (wie zu lassen, das Programm abstürzen Gegensatz), stellen Sie sicher, dass Sie die Ausnahme abfangen und kehren alle Speicherblöcke auf dem Heap, bevor die Zeiger, die ihnen außerhalb des Gültigkeitsbereichs und der Speicher gehen Punkt ist, hat verloren.

  5. Stellen Sie sicher, dass die Typen genau übereinstimmen.

    Achten Sie immer darauf, dass die Typen von Zeigern den gewünschten Typ entsprechen. Verwenden Sie keine Zeiger, ohne einem bestimmten Grund neu gefasst. Folgendes berücksichtigen:

Leere fn (int * p) - Leere myFunc () {char c = 'a'-char * pC = c-fn ((int *) pC) -}

Die obige Funktion ohne Beanstandung kompiliert, da der Zeichenzeiger pC hat zu einem int * Neufassung wurde die Deklaration von fn (int *) passen - allerdings wird dieses Programm fast sicher nicht funktionieren. Die Funktion fn () erwartet einen Zeiger auf eine volle 32-Bit-Integer und nicht einige rinky-dink 8-Bit-Zeichen. Diese Art von Problemen sind sehr schwer zu klären.

Wann und wie tiefe Kopien in C ++ zu machen

Klassen, die Ressourcen in ihren Konstruktor zuweisen sollte in der Regel eine Kopie Konstruktor enthalten Kopien dieser Ressourcen zu erstellen. einen neuen Speicherblock und Kopieren der Inhalte des Originals in diesem neuen Block Zuweisung ist als die Schaffung eines bekannten tiefe Kopie (Im Gegensatz zu den Standard flache Kopie im Gegensatz). Verwenden Sie die folgenden Schritte aus, um zu bestimmen, wie und wann tiefe Kopien in C ++ zu machen:

  1. Immer eine tiefe Kopie zu machen, wenn der Konstruktor weist Ressourcen.

    Standardmäßig macht C ++ so genannte "flache" member-by-Mitglied Kopien von Objekten, wenn sie Funktionen oder als Ergebnis einer Zuweisung vorbei. Sie müssen die Standard flache Kopie Betreiber mit ihren tiefen Kopie Äquivalent für jede Klasse ersetzen, die Ressourcen im Konstruktor zuweist. Die häufigste Ressource, die zugeordnet wird ist Heap-Speicher, der durch den neuen Betreiber zurückgegeben wird.

  2. Immer auch einen Destruktor für eine Klasse, die Ressourcen zuweist.

    Wenn Sie einen Konstruktor erstellen, die Ressourcen zuweist, müssen Sie eine destructor erstellen, die sie wieder her. Keine Ausnahmen.

  3. Immer erklären die destructor virtuell.

    Ein gemeinsamer Anfänger Fehler ist, zu vergessen Ihr Destruktor virtuell zu erklären. Das Programm läuft gut, bis einige ahnungslose Programmierer kommt und erbt von der Klasse. Das Programm erscheint nach wie vor zu arbeiten, sondern weil die destructor in der Basisklasse nicht ordnungsgemäß geltend gemacht werden kann, Speicherlecks aus dem Programm wie ein Sieb, bis es schließlich abstürzt. Dieses Problem ist schwer zu finden.

  4. Immer eine Kopie Konstruktor für eine Klasse, die Ressourcen zuweist.

    Der Copy-Konstruktor erstellt eine korrekte Kopie des aktuellen Objekts durch den Speicher aus der Halde Aufteilung und Kopieren des Inhalts des Quellobjekts.

  5. Immer überschreiben den Zuweisungsoperator für eine Klasse, die Ressourcen zuweist.

    Programmierer sollten aus zwingenden Betreiber davon abgehalten werden, aber der Zuweisungsoperator ist eine Ausnahme. Sie sollten den Zuweisungsoperator für jede Klasse überschreiben, die Ressourcen im Konstruktor zuweist.

    Der Zuweisungsoperator sollte drei Dinge tun:

  1. Stellen Sie sicher, dass die linke und rechte Hand Objekt Objekt nicht gleich sind. Mit anderen Worten, sicher sein, dass der Anwendungsprogrammierer nicht schreiben etwas wie (a = a). Wenn sie sind, nichts zu tun.

  2. Rufen Sie den gleichen Code wie der destructor auf der linken Objekt auf seine Ressourcen zurück.

  3. Rufen Sie den gleichen Code wie eine Kopie Konstruktor eine tiefe Kopie der rechten Hand Objekt in die linke Hand Objekt zu machen.

  • Wenn Sie das nicht können, dann löschen Sie den Kopierkonstruktor und den Zuweisungsoperator, so dass das Programm keine Kopien des Objekts zu machen.

  • Wenn Sie nicht selbst tun, weil Ihr Compiler nicht den C ++ 2011 löschen Konstruktor-Funktion nicht unterstützt, eine leere Kopierkonstruktors und Zuweisungsoperator erstellen und erklären ihnen geschützten anderen Klassen zu halten von ihnen.

  • Menü