Übungsaufgaben
Zehn Übungen zu Klassen, Konstruktoren, Kapselung und der Aufteilung auf .h und .cpp — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen die gestuften Tipps.
Nenne die fehlenden Fachbegriffe, indem du sie einsetzt — zwei Wörter bleiben übrig.
Eine Klasse ist der ; ein nach ihm angelegtes hat eigene Attributwerte. Attribute stehen meist im Bereich , damit nur die eigenen sie ändern können — dieses Prinzip heißt . Der heißt wie die Klasse, hat keinen Rückgabetyp und setzt die Startwerte.
public ist der häufigste Fehler: Öffentliche Attribute könnte jede Funktion beliebig ändern — genau das soll die Kapselung verhindern. Eine Referenz ist ein zweiter Name für eine Variable, kein Teil einer Klasse.private.Gib zu jeder Aussage an, ob sie stimmt.
void-Konstruktor kennen viele aus Versehen: Er sieht wie eine normale Methode aus, g++ lehnt ihn aber ab („return type specification for constructor invalid“).struct und class unterscheiden sich nur im Standard-Zugriff.class Zaehler { private: int stand; public: Zaehler(int start) { stand = start; } void klick() { stand = stand + 1; } int getStand() { return stand; } }; int main() { Zaehler z(7); z.klick(); z.klick(); Zaehler w(z.getStand() * 2); w.klick(); cout << z.getStand() + w.getStand() << endl; return 0; }
Bestimme die Ausgabe.
w.klick() erhöhe auch z — jedes Objekt hat aber sein eigenes Attribut stand.stand.Zu einer Klasse Lampe mit dem Attribut private: int hell; und dem Konstruktor Lampe(int h) hat g++ sechs Fehlermeldungen ausgegeben. Ordne jeder Meldung die Ursache zu.
Lampe:: ist dimmen eine ganz normale Funktion, die das Attribut hell nicht kennt. Und Lampe() in der vorletzten Meldung bedeutet „Konstruktor ohne Parameter“ — den gibt es nicht, weil nur Lampe(int h) definiert ist.Lampe::Lampe() ist der Konstruktor ohne Parameter.Die Klasse Thermometer ist auf thermo.h und thermo.cpp aufgeteilt; übersetzt wird mit g++ main.cpp thermo.cpp -o th. Ergänze die Lücken.
#ifndef THERMO_H #define THERMO_H class Thermometer { private: double grad; public: Thermometer(double start); void erwaermen(double d); double getGrad(); bool frostig(); #endif
#include Thermometer::Thermometer(double start) { grad = start; } void erwaermen(double d) { grad = grad + d; } double Thermometer::getGrad() { return grad; } Thermometer::frostig() { return grad < 0; }
bool frostig(); → bool Thermometer::frostig(). Typischer Fehler: Thermometer.erwaermen — der Punkt gehört zum Aufruf an einem Objekt, :: zur Definition. Eigene Header stehen in Anführungszeichen, Bibliotheks-Header in spitzen Klammern.thermo.cpp mit ihrem Prototyp im Header.}; — auch im Header.Achtung, hier steckt auch Ganzzahldivision aus 2.1.2 drin.
class Tank { private: int liter, max; public: Tank(int m) : liter(0), max(m) {} void tanken(int l) { liter = liter + l; if (liter > max) liter = max; } void fahren(int km) { liter = liter - km / 20; if (liter < 0) liter = 0; } int getLiter() { return liter; } }; Tank a(40), b(50); a.tanken(30); // Zeile 1 b.tanken(65); // Zeile 2 a.fahren(250); // Zeile 3 b.fahren(1010); // Zeile 4 a.tanken(b.getLiter() + 25); // Zeile 5
Stelle die Füllstände nach jeder Zeile in der Tabelle dar.
| nach | a.getLiter() | b.getLiter() |
|---|---|---|
| Zeile 1 | ||
| Zeile 2 | ||
| Zeile 3 | ||
| Zeile 4 | ||
| Zeile 5 |
liter auf 0 und max auf den Startwert. Zeile 2 kappt 65 auf 50, Zeile 3 rechnet 250 / 20 = 12 (nicht 12,5), Zeile 4 rechnet 1010 / 20 = 50 und landet bei 0, in Zeile 5 wird 18 + 25 = 43 auf das Maximum 40 gekappt. Typischer Fehler: in Zeile 3 auf 17,5 oder 17 kommen.liter und max: a darf höchstens 40, b höchstens 50 Liter haben.Du kennst Klassen schon aus Java. Vergleiche und markiere alle zutreffenden Aussagen.
private: und public: gelten für alles, was danach folgt. Konstruktoren gibt es wie in Java. Typischer Fehler: Die Java-Gewohnheit new in C++ übernehmen — Lampe l = new Lampe(3); übersetzt g++ nicht.new, das Semikolon am Ende und die Schreibweise von private.Der Wecker soll auf 6:45 gestellt werden und nach 30 Minuten die Stunde 7 ausgeben. Überprüfe den Code — drei Zeilen sind fehlerhaft.
main.private-Attribute greift man von außen nur über Methoden wie getStunde() zu.Du entwirfst eine Klasse Konto für eine Mensa-Karte mit PIN. Lege für jedes Mitglied fest, wohin es gehört — manches bietet man besser gar nicht an.
abheben prüft die PIN und den Kontostand. Ein setKontostand würde jede Regel umgehen, und getPin verrät das Geheimnis — beide machen die Kapselung wertlos. Typischer Fehler: zu jedem Attribut automatisch Getter und Setter anlegen.struct Punkt { int x, y; }; class Feld { int breite; public: Feld(int b) { breite = b; } int getBreite() { return breite; } };
In main stehen nacheinander: Punkt p; p.x = 3; · Feld f(5); · f.breite = 7; · Feld g; · cout << f.getBreite(); · Punkt q = {1, 2};. Beurteile jede Zeile und gib an, wie viele davon g++ fehlerfrei übersetzt.
Punkt p; p.x = 3;, Feld f(5);, cout << f.getBreite(); und Punkt q = {1, 2}; — also 4. Die Falle: Über int breite; steht kein private:, trotzdem ist es privat, weil in einer class alles bis zum ersten Bereich private ist. Feld g; scheitert, weil es keinen Konstruktor ohne Parameter gibt.class, bevor das erste public: kommt?struct ist alles öffentlich. Ein Objekt ohne Startwert braucht einen Konstruktor ohne Parameter.