Tipps
- Bei default Parametern und Überladung kann es zu "Mehrdeutigkeiten" kommen. void f(int); void f(int,int=0); int main() { f(3); } - welches f wird aufgerufen? Der Compiler kann nicht entscheiden und meldet einen Fehler. - Default Parameter
- lhs steht für Left Hand Side und rhs für Right Hand Side. Dies gibt die Seite an, auf der die Variable steht. Bei einer Addition ist dies noch unbedeutend, aber zB bei Divisionen ist es wichtig. Natürlich könnte man auch Dividend und Divisor nehmen - aber lhs und rhs bedeuten das Gleiche, sind aber einfacher zu merken und leichter zu verstehen. - Funktionen
- Unter umständen reicht ein cin.get(); nicht aus um das schließen des Fensters zu verhindern. Dann kann man mit cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); den Eingabepuffer löschen.
Kurze Erklärung: cin.clear() versetzt cin wieder in den Ursprungsstatus (zB Fehler werden wieder zurückgesetzt). cin.ignore(cin.rdbuf()->in_avail()); löscht alle Zeichen die noch im Einagebpuffer stehen (wenn man cin.get() schreibt, und jemand gibt 2 Zeichen ein, bleibt 1 Zeichen im Puffer stehen - denn cin.get() liest ja nur eines aus). - Hello World - Alle Werte ungleich 0 sind in C++ true(wahr). dh ein if(1) oder if(-200) ist immer wahr! - if und else
- In C++ gibt es 'Lazy Evaluation' - das bedeutet dass ein Ausdruck nur soweit ausgewertet wird, bis das Ergebnis feststeht: if(true || false) - hier wird nur true ausgewertet und false nicht mehr beachtet. Denn es ist ja egal ob der zweite Wert true oder false ist, denn true || false ist genauso wahr wie true || true. Dito bei &&: if(false && true) - hier wird true nicht mehr beachtet denn false && true ergibt genauso false wie false && false. - if und else
- Generell sollte man die einzeiligen Kommentare bevorzugen -> denn dann kann man ganze Codeblöcke mit /* und */ Auskommentieren. Denn /* */ kann man leider nicht schachteln. Ein /* Hallo /* Frosch */ Welt */ ist also nicht erlaubt! - Kommentare
- sizeof(char) ist immer 1 - Operatoren
- Eine rekursive Funktion braucht immer eine Abbruch-Bedingung. In unserem Beispiel ist diese Bedingung: wenn times 0 ist, ist das Ergebnis auch 0. Jede Rekursion braucht so eine Ausnahme, denn sonst läuft sie ewig. - Rekursion
- Meistens verwendet man i als Laufvariable. Wenn man mehrere braucht verwendet man i,j,k. Durch diese Namenskonvention erkennt man recht schnell was diese Variable macht. - Schleifen
- Statt i=i+1; kann man auch i+=1; oder ++i; schreiben. ++ bedeutet um 1 erhöhen. - Schleifen
- Um die Adresse eines Arrays zu ermitteln gibt es 3 Möglichkeiten: char* p=array; - ein Array verhält sich fast immer wie ein Zeiger. char* p=&array; - ganz 'normal' die Adresse ermitteln. char* p=&array[0]; - hier wird die Adresse des ersten Elements ermittelt. - Zeiger
- Wenn wir einen Zeiger vom Typ void* anlegen, dann haben wir einen nicht-typisierten Zeiger. Ein void* kann sowohl auf int, char als auch auf was ganz anderes zeigen. Denn er beinhaltet nur die Speicheradresse, nicht aber Informationen über den Typen auf den er zeigt. Aus diesem Grund, kann man ihn auch nicht dereferenzieren, sondern muss ihn vorher einen einen typisierten Zeiger casten. - Zeiger
- In C++ spricht man auch öfters vom Free Store, wenn man den Heap meint. - dynamische Speicherreservierung
- Damit man es nicht immer um das löschen eines am Heap angelegten Objektes kümmern muss, verwendet man das RAII-Idiom (zB Smart Pointer). - dynamische Speicherreservierung
- Statt Benjamin ist ein Objekt der Klasse Elefant, kann man auch Benjamin ist eine Instanz von Elefant sagen. - Was ist Objekt Orientierte Programmierung
- Der Strichpunkt am Ende der Klassendefinition ist deshalb nötig, da man hier bereits Variablen anlegen kann. zB class Test {} a; Hier ist a bereits eine Instanz von Test. Dies ermöglicht es 'unnamed classes' zu erstellen: class {} a; - a ist Objekt einer unbenannten Klasse. Allerdings wird dies nur sehr selten verwendet. - Was ist Objekt Orientierte Programmierung
- Viele Leute Kennzeichnen Membervariablen zB durch einen Unterstrich am Ende, oder ein m_ am Anfang. Beispiele dafür sind: int count_; int m_count; int mCount; int _count; int count_m;. - Was ist Objekt Orientierte Programmierung
- setter und getter sind Methoden die ein Attribut setzen. Car car; car.setColor("red"); car.faster(); Hier ist setColor() ein setter, da er das Attribut color des Autos setzt, aber faster() ist eine 'normale' Methode. Man kann Getter und Setter mittels Überladung zusammenführen: class Test { public: void Color(color const&); color Color() const; };. - Verhältnis Klasse zu Objekt
- Statt Klasse* p; (*p).foo(); kann man einfach p->foo(); schreiben. - Der this-Zeiger
- Statt mittels int foo(int) kann man einen Funktionszeiger auch mittels int (*foo)(int) erstellen. Die zweite Variante ist die gängigere, denn mit der ersten Variante kann man keinen Funktionszeiger direkt als Variable erstellen. int foo(int); wäre ja die Deklaration einer Funktion foo. int (*foo)(int); ist ein Zeiger auf eine Funktion. - Funktionszeiger
top