Was ist die Hauptaufgabe einer höheren Programmiersprache?
: Sie soll die Programmierung einfacher und verständlicher machen, indem sie Befehle bietet, die näher an der menschlichen Sprache sind.
Was ist das Ziel des Kapitels „Grafische Oberfläche per Code erstellen“?
Zu lernen, wie man grafische Oberflächen in Qt ohne Designer, nur durch Code-Anweisungen, erstellt.
Welche zwei Widgets werden im Beispiel verwendet?
Ein Label (QLabel) für Textausgabe und eine Schaltfläche (QPushButton) für Benutzerinteraktion.
QLabel
QPushButton
Welche Header-Dateien müssen eingebunden werden, um Label und Button zu verwenden?
#include <QApplication>#include
<QMainWindow>
#include <QLabel>
#include <QPushButton>
Wofür steht die Klasse QApplication?
QApplication
Für die eigentliche Anwendung – sie verwaltet Ereignisse und die Programmsteuerung.
Wofür steht die Klasse QMainWindow?
QMainWindow
Für das Hauptfenster der Anwendung (das Haupt-Widget).
Wie wird ein Label erstellt und einem Hauptfenster zugeordnet?
QLabel *helloWorldLabel = new QLabel(hauptfenster);
Wie wird der Text eines Labels gesetzt?
helloWorldLabel->setText("Hallo Welt");
Warum wird beim Methodenaufruf der Operator -> verwendet?
->
Weil auf das Objekt über einen Zeiger zugegriffen wird.
Wie kann man Text direkt beim Erzeugen eines Labels oder Buttons setzen?
Beim Konstruktor angeben, z. B.:new QLabel("Hallo Welt", hauptfenster);odernew QPushButton("Beenden", hauptfenster);
new QLabel("Hallo Welt", hauptfenster);
new QPushButton("Beenden", hauptfenster);
Wie wird die Ereignisverbindung zwischen Button und Anwendung hergestellt?
QObject::connect(beendenButton, SIGNAL(clicked()), &a, SLOT(quit()));
Was passiert bei dieser Verbindung?
Wenn der Button „Beenden“ angeklickt wird, ruft das Signal clicked() den Slot quit() der Anwendung auf und beendet sie.
clicked()
quit()
Warum steht beim QApplication-Objekt ein & vor dem Namen?
&
Weil die connect-Funktion die Adresse von Sender und Empfänger erwartet.
connect
Welche Methode wird verwendet, um Widgets zu positionieren?
setGeometry()
Welche vier Argumente erwartet setGeometry()?
x-Position (Abstand von links)
y-Position (Abstand von oben)
Breite
Höhe
Wie positioniert man das Label 20 px von links, 10 px von oben mit Größe 100×20?
helloWorldLabel->setGeometry(20, 10, 100, 20);
Wie wird der Button direkt unter dem Label positioniert?
beendenButton->setGeometry(20, 30, 100, 25);
Was passiert, wenn man keine Position angibt?
Widgets werden standardmäßig links oben im Eltern-Widget platziert und können sich überlappen.
Wie werden Label und Button in der Klasse MainWindow erzeugt?
MainWindow
Im Konstruktor
helloWorldLabel = new QLabel(this);
beendenButton = new QPushButton(this);
Warum wird this beim Erzeugen der Widgets übergeben?
this
Weil this auf die aktuelle Instanz von MainWindow verweist – also auf das Haupt-Widget.
Wie sieht die connect-Anweisung in der Klassenvariante aus?
QObject::connect(beendenButton, SIGNAL(clicked()), qApp, SLOT(quit()));
Was passiert mit Widgets, die mit new erzeugt werden, wenn das Eltern-Widget gelöscht wird?
new
Sie werden automatisch freigegeben, ein delete ist nicht nötig.
delete
Wie kann man die passende Header-Datei für ein Widget im Qt Creator finden?
Rechtsklick auf den Widget-Typ → Refactoring → Header-Dateien werden vorgeschlagen.
Was ist qApp?
qApp
Ein globaler Zeiger auf das aktuelle QApplication-Objekt – nützlich für Verbindungen innerhalb von Klassen.
Wie zeigt der Qt Designer bestehende Verbindungen an?
Durch Linien zwischen den Objekten und im „Signals and Slots Editor“ unten im Fenster.
Wie kann man Verbindungen auch ohne Maus erstellen?
Direkt im „Signals and Slots Editor“, indem man Sender, Empfänger, Signal und Slot aus Listen auswählt.
: Was sind die Hauptbestandteile des Signal-Slot-Konzepts?
Signal: Wird beim Eintreten eines Ereignisses gesendet.
Slot: Reagiert auf das Signal.
connect(): Verbindet Signal und Slot.
Frage: Was ist der Vorteil des Signal-Slot-Konzepts?
Es ermöglicht lose gekoppelte, flexible und ereignisgesteuerte Kommunikation zwischen Objekten.
Wie sieht die Variante mit Funktionszeigern aus?
QObject::connect(beendenButton, QPushButton::clicked, &a, QApplication::quit);
Welche Signale besitzt z. B. ein QPushButton?
clicked(), pressed() und released().
pressed()
released()
Welche Slots besitzt z. B. das Haupt-Widget?
close() und showMaximized().
close()
showMaximized()
Wie funktioniert die Kommunikation zwischen Objekten grundsätzlich?
Ein Senderobjekt sendet eine Nachricht (z. B. ein Signal), und ein Empfängerobjekt reagiert darauf über eine spezielle Methode (Slot).
Können mehrere Objekte auf dasselbe Signal reagieren?
Ja, ein Signal kann an mehrere Slots gesendet werden – die Reihenfolge der Ausführung ist dabei jedoch nicht festgelegt.
Warum sollte man vermeiden, dass ein Signal mehrere abhängige Slots ausführt?
Weil die Ausführungsreihenfolge der Slots nicht garantiert ist – stattdessen sollte man die Aktionen in einem Slot zusammenfassen.
Wie verbindet man Signale und Slots im Qt Designer?
Über den Modus „Signals und Slots bearbeiten“, indem man per Maus vom Senderobjekt zum Empfängerobjekt zieht.
Was geschieht, wenn man im Qt Designer ein Signal mit einem Slot verbindet?
Qt erstellt automatisch die entsprechende connect()-Verbindung im Hintergrund.
connect()
Was ist ein Ereignis in der Programmierung?
in Ereignis ist eine Aktion, die in einem Programm eine Reaktion auslösen kann – z. B. ein Mausklick, Tastendruck oder Doppelklick.
Wie unterscheidet sich ereignisorientierte Programmierung von sequenzieller Programmierung?
Bei sequenzieller Programmierung läuft der Code strikt der Reihe nach ab, während ereignisorientierte Programmierung flexibel auf externe Aktionen reagiert.
Warum erhöht Ereignisverarbeitung die Betriebssicherheit?
Aktionen werden nur ausgeführt, wenn ein Ereignis tatsächlich eintritt – so werden unerwartete Situationen (z. B. Verbindungsverlust) besser abgefangen.
Was ist das Signal-Slot-Konzept in Qt?
Es ist ein Mechanismus, mit dem Objekte in Qt auf Ereignisse reagieren, indem Signale gesendet und Slots (Reaktionen) ausgeführt werden.
Was ist ein Signal in Qt?
Ein Signal ist eine Nachricht, die ein Objekt aussendet, wenn ein bestimmtes Ereignis eintritt (z. B. clicked() bei einem Button).
Was bedeutet „ein Signal emittieren“?
„Emittieren“ ist der Fachausdruck für das Aussenden eines Signals.
Was ist ein Slot?
Ein Slot ist eine normale Methode einer Klasse, die auf ein bestimmtes Signal reagiert.
Wie werden Signale und Slots miteinander verbunden?
Durch die Methode QObject::connect().
QObject::connect()
Was passiert in folgendem Beispiel? QObject::connect(beendenButton, SIGNAL(clicked()), &a, SLOT(quit()));
Wenn der Button beendenButton angeklickt wird, führt das Objekt a die Slot-Methode quit() aus
beendenButton
a
Was bedeutet der Begriff Polymorphismus wörtlich und woher stammt er?
Polymorphismus stammt aus dem Griechischen und bedeutet „vielgestaltig“.
Was beschreibt Polymorphismus in der objektorientierten Programmierung?
Polymorphismus beschreibt die Fähigkeit, dass dieselbe Methode oder derselbe Begriff in unterschiedlichen Kontexten unterschiedliche Bedeutungen bzw. Wirkungen haben kann.
Welches Prinzip aus dem menschlichen Denken wird durch Polymorphismus in der OOP abgebildet?
Dass Begriffe kontextabhängig unterschiedliche Bedeutungen haben können.
Nenne ein alltägliches Beispiel für Polymorphismus.
Das Wort „Bedienung“ kann im Restaurant den Service und bei einem Computerprogramm die Handhabung bezeichnen.
Nenne ein Beispiel für Polymorphismus in der Programmierung.
Eine Methode addieren(), die bei Zahlen eine Summe bildet (5 + 4 = 9) und bei Zeichenketten eine Verkettung durchführt („Auto“ + „haus“ = „Autohaus“).
addieren()
Was bedeutet „Überschreiben“ (Overriding) einer Methode?
Eine Methode mit gleichem Namen und gleicher Parameterliste wird in einer abgeleiteten Klasse neu definiert und ersetzt die geerbte Version.
Warum überschreibt man manchmal eine geerbte Methode?
Weil abgeleitete Klassen ein unterschiedliches Verhalten benötigen, z. B. bewegen() für Känguru, Bär und Wal.
bewegen()
Worin unterscheidet sich Überladen von Überschreiben?
Überladen (Overloading): Mehrere Methoden mit gleichem Namen, aber unterschiedlichen Parameterlisten in derselben Klasse.
Überschreiben (Overriding): Gleicher Methodenname und gleiche Parameterliste in verschiedenen Klassen (Vererbung).
Warum funktioniert einfaches Überschreiben ohne „virtual“ nicht dynamisch?
Weil der Compiler bei der Übersetzung die Methode fest einer Klasse zuordnet (statische Bindung).
Was ist das Problem der statischen Bindung?
Der Compiler entscheidet schon beim Übersetzen, welche Methode ausgeführt wird – nicht zur Laufzeit. Dadurch kann falsches Verhalten entstehen, wenn über einen Basisklassenzeiger auf ein Objekt der abgeleiteten Klasse zugegriffen wird.
Wie erreicht man dynamische Bindung in C++?
Durch Deklaration einer Methode mit dem Schlüsselwort virtual.
virtual
Was bedeutet das Schlüsselwort virtual in einer Methode?
Es ermöglicht, dass die Methode zur Laufzeit (dynamisch) anhand des tatsächlichen Objekttyps aufgerufen wird.
Wofür wird das Schlüsselwort override verwendet?
override
Es kennzeichnet in einer abgeleiteten Klasse ausdrücklich, dass eine virtuelle Methode der Basisklasse überschrieben wird.
Wie nennt man die dynamische Zuordnung einer Methode zur Laufzeit?
Dynamische oder späte Bindung (late binding).
Was muss man zusätzlich definieren, wenn eine Klasse virtuelle Methoden enthält?
Einen virtuellen Destruktor, damit beim Löschen eines Objekts über einen Basisklassenzeiger auch der Destruktor der abgeleiteten Klasse ausgeführt wird.
Warum sollte man Methoden, die eventuell überschrieben werden, grundsätzlich als virtual deklarieren?
Um Flexibilität zu erhalten und Fehler zu vermeiden, wenn eine Methode überschrieben werden soll, aber nicht als virtuell markiert ist.
Was bedeutet das Prinzip der Substitution?
Eine abgeleitete Klasse kann überall dort eingesetzt werden, wo eine Basisklasse erwartet wird.
Wie zeigt Qt Creator virtuelle Methoden im Code an?
Virtuelle Methoden werden kursiv dargestellt.
Was zeigt typeid().name() in C++ an?
typeid().name()
Den Namen des Typs bzw. der Klasse des Objekts, auf das this verweist.
Wie erkennt man in der Klassenanzeige von Qt Creator geschützte (protected) und private Attribute?
Protected: Symbol eines Schlüssels
Private: Symbol eines Vorhängeschlosses
Auf welche Variante konzentriert sich der Lehrgang hauptsächlich?
Auf die Qt-Widgets-Anwendung.
Was ist ein Widget?
Ein Objekt in der grafischen Oberfläche einer Qt-GUI-Anwendung – z. B. ein Fenster, eine Schaltfläche oder ein Textfeld.
Woher stammt der Begriff „Widget“?
Aus den englischen Wörtern Window (Fenster) und Gadget (Apparat).
Welche Arten von Widgets gibt es?
Haupt-Widgets (Main Widgets): Container für andere Widgets, z. B. das Hauptfenster.
Sub-Widgets: enthaltene Elemente, z. B. Schaltflächen oder Eingabefelder.
Welche Eigenschaften haben Anwendungsfenster?
Sie können verschoben, minimiert, maximiert und in der Größe verändert werden. Sie besitzen eine Titelleiste mit Name und Symbolen.
Nenne typische Bedienelemente in einem GUI-Fenster.
Menüleisten
Symbolleisten
Menübänder
Listen- und Kombinationsfelder
Kontrollkästchen
Schaltflächen
Schieberegler
Wie wird ein neues GUI-Projekt in Qt Creator erstellt?
Menü Datei → Neu… wählen.
Kategorie Anwendung (Qt) auswählen.
Vorlage Qt Widgets-Anwendung wählen.
Namen und Ordner festlegen.
Einstellungen bestätigen und Abschließen klicken.
Welche Hauptdateien werden bei einem Qt-Widgets-Projekt erstellt?
mainwindow.h (Header-Datei)
mainwindow.h
mainwindow.cpp (Implementierung)
mainwindow.cpp
mainwindow.ui (Formulardatei für GUI)
mainwindow.ui
Was enthält die Klasse MainWindow?
Sie erbt von QMainWindow.
Sie enthält Konstruktor, Destruktor und ein Attribut Ui::MainWindow *ui für die Oberfläche.
Ui::MainWindow *ui
Welche Aufgabe hat die Datei main.cpp?
main.cpp
Sie enthält den Programmeinstieg (main()-Funktion) und startet die Anwendung.
main()
Was bewirkt die Zeile QApplication a(argc, argv);?
QApplication a(argc, argv);
Erstellt ein QApplication-Objekt für die Ereignisverarbeitung des Programms (zwingend notwendig für jede GUI-Anwendung).
Was macht MainWindow w;?
MainWindow w;
Erzeugt eine Instanz des Hauptfensters (Klasse MainWindow), die von QMainWindow erbt.
Wozu dient w.show();?
w.show();
Zeigt das Hauptfenster auf dem Bildschirm an.
Wozu dient return a.exec();?
return a.exec();
Startet die Ereignisschleife der Anwendung. Sie läuft, bis das Hauptfenster geschlossen wird, und gibt dann 0 zurück.
Was passiert beim Schließen des Haupt-Widgets?
Die gesamte Anwendung wird automatisch beendet.
Welche Datei beschreibt die grafische Oberfläche?
Die Datei mainwindow.ui.
Womit kann die .ui-Datei bearbeitet werden?
.ui
Mit dem Qt Designer, der im Qt Creator integriert ist.
In welchen Arbeitsbereich wechselt der Qt Creator beim Öffnen der .ui-Datei?
In den Arbeitsbereich Design.
Was ist XML in diesem Zusammenhang?
XML (eXtensible Markup Language) beschreibt die Struktur der Oberfläche in der .ui-Datei textbasiert.
Wie legt man ein Qt-Quick-Projekt an?
Beim Anlegen eines neuen Projekts den Typ Qt Quick-Anwendung (z. B. „Stack“) wählen.
In welcher Sprache ist der Quelltext einer Qt-Quick-Anwendung geschrieben?
In QML, nicht in C++.
Für welche Anwendungen eignet sich Qt Quick besonders?
Für mobile Anwendungen und moderne, animierte Oberflächen.
Was wird in diesem Kapitel behandelt?
Das Erstellen von Programmen mit grafischen Oberflächen (GUIs) in Qt, deren Aufbau und das Anlegen neuer Projekte im Qt Creator.
Was bedeutet GUI?
GUI steht für Graphical User Interface – also eine grafische Benutzeroberfläche.
Programmierung der gesamten Anwendung per Hand mit Qt-Klassen.
Verwendung einer Vorlage für eine Qt-Widgets-Anwendung (Formulare und Widgets).
Verwendung einer Vorlage für eine Qt-Quick-Anwendung (QML-basierte Oberfläche).
Was ist der Unterschied zwischen Qt Widgets und Qt Quick?
Qt Widgets: klassische Desktop-GUIs mit C++ und Widgets.
Qt Quick: moderne GUIs mit QML und JavaScript, häufig für mobile Anwendungen.
Welche drei Möglichkeiten gibt es, Programme mit grafischer Oberfläche in Qt zu erstellen?
Was versteht man unter Überladen (Overloading) in C++?
Überladen bedeutet, dass mehrere Methoden oder Funktionen denselben Namen haben, sich aber durch ihre Parameterlisten unterscheiden.
Woran erkennt der Compiler, welche überladene Methode aufgerufen werden soll?
Anhand der Parameterliste (Anzahl und Typen der Parameter).
Reicht ein unterschiedlicher Rückgabetyp für überladene Methoden aus?
Nein, die Parameterlisten müssen sich unterscheiden. Unterschiedliche Rückgabetypen allein führen zu einem Kompilierfehler.
Wann kommt es bei überladenen Methoden zu Mehrdeutigkeiten (ambiguous calls)?
Wenn der Compiler anhand der Argumente nicht eindeutig entscheiden kann, welche Methode gemeint ist – z. B. bei automatischer Typumwandlung zwischen int und float.
int
float
Wie lässt sich eine Mehrdeutigkeit beim Aufruf überladener Funktionen vermeiden?
Durch explizites Typecasting der Argumente, z. B.:rechnung(static_cast<float>(1.2), static_cast<float>(2.1));
rechnung(static_cast<float>(1.2), static_cast<float>(2.1));
Kann man auch Konstruktoren überladen?
Ja, Konstruktoren können überladen werden, indem sie verschiedene Parameterlisten haben.
Warum ist das Überladen bei Konstruktoren besonders nützlich?
Weil Konstruktoren immer denselben Namen wie die Klasse tragen und man so verschiedene Möglichkeiten zur Objekterzeugung bieten kann (z. B. mit/ohne Parameter).
Was passiert im Beispiel, wenn eine Instanz mit unterschiedlichen Argumentlisten erzeugt wird?
Der Compiler wählt automatisch den passenden Konstruktor anhand der Argumente aus.
Wie nennt man den Konstruktor ohne Parameter?
Standardkonstruktor
Was ist eine Elementinitialisierungsliste in C++?
Eine spezielle Syntax, mit der Klassenattribute direkt beim Aufruf des Konstruktors initialisiert werden, statt erst im Rumpf des Konstruktors.
Wie wird eine Elementinitialisierungsliste eingeleitet?
Durch einen Doppelpunkt (:) hinter dem Konstruktorkopf. Sherry::Sherry(int tAlter) : alter(tAlter), liter(1) {}
Was steht in der Elementinitialisierungsliste?
Aufrufe von Variablenkonstruktoren, keine Zuweisungen.(z. B. alter(tAlter) statt alter = tAlter;)
alter(tAlter)
alter = tAlter;
Was ist ein Variablenkonstruktor?
Ein Konstruktor, der automatisch aufgerufen wird, wenn eine Variable erzeugt wird; in der Elementinitialisierungsliste wird er zur Initialisierung einzelner Attribute genutzt.
Wie werden mehrere Initialisierungen in einer Elementinitialisierungsliste getrennt?
Durch Kommas, z. B.:Sherry::Sherry(int tAlter): alter(tAlter), liter(1) {}
Sherry::Sherry(int tAlter): alter(tAlter), liter(1) {}
Worin liegt der Unterschied zwischen einer Elementinitialisierungsliste und einer Zuweisung im Konstruktor?
Die Elementinitialisierungsliste initialisiert die Variablen direkt bei der Objekterzeugung.
Eine Zuweisung erfolgt erst nach der Konstruktion der Attribute.
Wann ist die Elementinitialisierungsliste zwingend erforderlich?
Bei der Vererbung, um den Konstruktor der Basisklasse aufzurufen.
Frage: Was bedeutet „Vererbung“ in der objektorientierten Programmierung?
Vererbung bedeutet, dass eine Klasse (Unterklasse) Attribute und Methoden einer anderen Klasse (Oberklasse) übernimmt und erweitern oder anpassen kann.
Was ist der Vorteil der Vererbung gegenüber dem erneuten Erstellen ähnlicher Klassen?
Klassen müssen nicht neu erstellt werden; man kann bestehende Klassen wiederverwenden und erweitern, wodurch der Quellcode effizienter und übersichtlicher wird.
: Wie nennt man die Klasse, die in der Hierarchie direkt über einer anderen liegt?
Diese Klasse wird Oberklasse oder superclass genannt.
Wie nennt man die Klasse, die in der Hierarchie direkt unter einer anderen liegt?
Diese Klasse wird Unterklasse oder subclass genannt.
Wie lässt sich die Vererbung umgangssprachlich ausdrücken?
Durch die Beziehung „ist ein“, z. B. „Ein Känguru ist ein Beuteltier.“
Was wäre ohne Vererbung notwendig, um „Sportwagen“ und „Geländewagen“ zu programmieren?
Man müsste alle gemeinsamen Attribute (z. B. Geschwindigkeit, Position) mehrfach neu definieren.
Ist eine Vererbung zwischen Klassen auf derselben Ebene möglich?
Nein, z. B. kann „Bär“ nicht von „Beuteltier“ erben.
Welche Methoden werden nicht automatisch vererbt?
Konstruktoren und Destruktoren.
Was ist Mehrfachvererbung?
Eine Klasse erbt von mehreren Oberklassen gleichzeitig.
Warum sollte man Mehrfachvererbung vermeiden?
Sie kann unübersichtlich werden und zu Fehlern in der Klassenhierarchie führen.
ann macht eine Vererbung Sinn?
Nur, wenn zwischen zwei Klassen die Beziehung „A ist ein B“ besteht.
Wie sollte eine Klassenhierarchie idealerweise aufgebaut werden?
Von oben nach unten – erst abstrakte, dann immer konkretere Klassen.
Wann sollte eine neue Unterklasse gebildet werden?
Wenn sie
ein neues Attribut,
eine neue Methode hat oder
ihr Verhalten sich ändert.
Warum kann der C++-Compiler logische Fehler in einer Klassenhierarchie nicht erkennen?
Er prüft nur die Syntax, nicht die inhaltliche Logik der Beziehungen.
Welche typische Fehlvererbung nennt der Text als Beispiel?
„Känguru ist ein Bär“ – syntaktisch erlaubt, aber logisch falsch.
Was ist die Unified Modeling Language (UML)?
Eine standardisierte objektorientierte Modellierungssprache für Softwaresysteme.
Wie werden Klassen im UML-Klassendiagramm dargestellt?
Als Rechteck mit Klassennamen, Attributen und Methoden.
Wie wird eine Vererbung im UML-Diagramm dargestellt?
Durch eine Linie mit einem Dreieck, das auf die Oberklasse zeigt.
Warum fehlen geerbte Attribute und Methoden oft in UML-Diagrammen?
Weil sie automatisch übernommen werden und nicht erneut aufgeführt werden müssen.
Welche Funktion können UML-Tools zusätzlich bieten?
Sie können aus Klassendiagrammen automatisch Quelltext-Gerüste erzeugen.
as sind die drei Hauptvorteile der Vererbung?
Wiederverwendung von Code
Erweiterbarkeit
Strukturierte Hierarchie
Welche Regel gilt für sinnvolle Vererbungsbeziehungen?
Nur dann, wenn die Aussage „A ist ein B“ logisch richtig ist.
Worin liegt die Gefahr bei unüberlegter Mehrfachvererbung?
In unklaren Zuständigkeiten, doppelten Attributen und schwer nachvollziehbarem Verhalten.
Wie wird in C++ festgelegt, dass eine Klasse von einer anderen Klasse erbt?
Durch die Syntax class Unterklasse : public Oberklasse
Was bedeutet das Schlüsselwort public bei der Vererbung?
public
: Es legt fest, dass die öffentlichen Elemente (public) der Basisklasse auch in der abgeleiteten Klasse öffentlich bleiben und zugänglich sind.
Welche Elemente werden bei der Vererbung nicht automatisch übernommen?
Warum wird in C++ auf Attribute meist über Methoden zugegriffen?
Um die Datenkapselung zu wahren – Attribute sollen nicht direkt, sondern nur über Methoden verändert oder gelesen werden.
Was erbt die Klasse ElternBaer von der Klasse Baer?
ElternBaer
Baer
Die Attribute gewicht und alter sowie die Methoden getGewicht() und getAlter().
gewicht
alter
getGewicht()
getAlter()
Warum ist eine Initialisierungsliste besser als eine Zuweisung im Konstruktor?
Sie initialisiert die Attribute direkt bei der Objekterzeugung, statt erst nachträglich – das ist effizienter und bei manchen Datentypen zwingend erforderlich.
Warum konnte der Compiler den ersten Code nicht übersetzen?
Weil der Konstruktor der Basisklasse Baer Parameter erwartet, aber nicht automatisch von ElternBaer aufgerufen wurde.
Warum muss der Konstruktor der Basisklasse manuell aufgerufen werden?
Beim Erzeugen eines Objekts der abgeleiteten Klasse muss zuerst ein Objekt der Basisklasse erstellt werden – der Compiler weiß aber nicht, welche Werte er übergeben soll.
Wie wird der Konstruktor der Basisklasse in der abgeleiteten Klasse aufgerufen?
Über die Elementinitialisierungsliste:
ElternBaer::ElternBaer(int tGewicht, int tAlter, int tKinder)
: Baer(tGewicht, tAlter)
{
anzahlKinder = tKinder;
}
Wann ist der Aufruf des Basisklassen-Konstruktors in der Initialisierungsliste nicht erforderlich?
Wenn die Basisklasse einen Standardkonstruktor (ohne Parameter) besitzt – dieser wird automatisch aufgerufen.
Was ist ein delegierender Konstruktor?
Ein Konstruktor, der einen anderen Konstruktor derselben Klasse über die Initialisierungsliste aufruft.
Warum sollte man private Attribute nicht einfach zu public ändern, um auf sie zuzugreifen?
Weil dadurch die Datenkapselung verloren geht – jedes Objekt oder jede Klasse könnte die Attribute direkt verändern.
Wie kann man es erlauben, dass abgeleitete Klassen auf Attribute der Basisklasse zugreifen dürfen, ohne sie öffentlich zu machen?
Indem man sie mit dem Zugriffsmodifizierer protected deklariert.
protected
Was bedeutet das Schlüsselwort protected?
Geschützte Elemente sind für die eigene Klasse und alle abgeleiteten Klassen sichtbar, aber nicht für andere Klassen.
Welche drei Zugriffsarten für Attribute und Methoden gibt es in C++?
private – nur innerhalb der Klasse sichtbar
private
protected – in der Klasse und ihren Unterklassen sichtbar
public – überall sichtbar
Warum ist protected oft der beste Kompromiss bei Vererbung?
Weil es die Datenkapselung wahrt, aber trotzdem kontrollierten Zugriff für Unterklassen ermöglicht.
In welcher Reihenfolge werden beim Erzeugen eines Objekts Konstruktoren aufgerufen?
Zuerst der Konstruktor der Basisklasse, danach der Konstruktor der abgeleiteten Klasse.
Was passiert, wenn eine Basisklasse keinen passenden Konstruktoraufruf erhält?
Der Compiler meldet einen Fehler, weil er nicht weiß, wie die Basisklasse initialisiert werden soll.
Welche Sichtbarkeiten sind bei Vererbung wichtig zu verstehen, um Fehler zu vermeiden?
private, protected, public – sie bestimmen, welche Klassen auf Attribute und Methoden zugreifen dürfen.
Welches Prinzip wird durch den Zugriffsschutz (private, protected, public) unterstützt?
Das Prinzip der Datenkapselung.
Was darf nicht in einer Elementinitialisierungsliste stehen?
Zuweisungen (z. B. alter = tAlter;) – nur Konstruktoraufrufe sind erlaubt.
Frage: Wofür ist das Überladen nützlich?
Um ähnliche Funktionen oder Konstruktoren mit unterschiedlichen Eingaben zu definieren, ohne verschiedene Namen vergeben zu müssen.
Was ist der Vorteil der Elementinitialisierungsliste?
Sie ist effizienter und sauberer, da Attribute direkt beim Erstellen des Objekts initialisiert werden.
Wie erkennt man einen Destruktor syntaktisch?
Ein Destruktor hat denselben Namen wie die Klasse, jedoch mit einer Tilde (~) davor, z. B. ~Klassenname().
~Klassenname()
Welche Gemeinsamkeiten haben Konstruktor und Destruktor in der Syntax?
Beide haben denselben Namen wie die Klasse und keinen Rückgabetyp.
Welche Unterschiede bestehen zwischen Konstruktor und Destruktor?
Der Konstruktor initialisiert eine Instanz, der Destruktor räumt sie auf.
Der Konstruktor kann Parameter annehmen, der Destruktor nicht.
Der Destruktor hat zusätzlich das Symbol ~ vor dem Namen.
~
Wozu dient der Destruktor praktisch?
Er wird verwendet, um Ressourcen freizugeben, bevor eine Instanz gelöscht wird, z. B. Speicher oder Datei-Handles.
Was passiert, wenn man das Tilde-Zeichen ~ beim Definieren des Destruktors vergisst?
Dann erstellt man versehentlich einen Konstruktor, keinen Destruktor.
Warum sollte man darauf achten, alle mit new erzeugten Instanzen auch mit delete zu löschen?
Um Speicherlecks zu vermeiden, da ohne delete der Destruktor nicht aufgerufen und der belegte Speicher nicht freigegeben wird.
Was passiert, wenn man eine Instanz nicht mit delete zerstört?
Der Destruktor wird nicht ausgeführt, und der Speicher bleibt belegt (Speicherleck).
Was zeigt eine Warnung über ein Speicherleck im Programm an?
Dass eine oder mehrere Instanzen nicht korrekt freigegeben wurden, also deren Destruktor nicht aufgerufen wurde.
Was sind Konstruktoren und Destruktoren in der objektorientierten Programmierung?
Konstruktoren und Destruktoren sind spezielle Methoden, die automatisch beim Erzeugen bzw. Zerstören einer Instanz einer Klasse ausgeführt werden.
Wann wird ein Konstruktor aufgerufen?
Ein Konstruktor wird automatisch aufgerufen, sobald eine neue Instanz einer Klasse erzeugt wird.
Wie lautet die wichtigste Regel für die Namensgebung eines Konstruktors?
Der Konstruktor trägt exakt denselben Namen wie die Klasse und hat keinen Rückgabetyp – auch nicht void.
void
Was ist der Unterschied zwischen einer normalen Initialisierungsmethode (z. B. init()) und einem Konstruktor?
init()
Eine Initialisierungsmethode muss manuell nach der Instanzerzeugung aufgerufen werden, während ein Konstruktor automatisch beim Erzeugen der Instanz ausgeführt wird.
Warum ist die Initialisierung über einen Konstruktor realistischer als über eine separate Methode?
Weil Objekte in der realen Welt meist direkt beim Erstellen ihre Eigenschaften erhalten und nicht erst in einem zweiten Schritt.
Was passiert, wenn ein Konstruktor nicht als public deklariert wird?
Dann kann von außen keine Instanz der Klasse erzeugt werden. Konstruktoren müssen daher in der Regel public sein.
Wie viele Male kann eine Instanz über einen Konstruktor initialisiert werden?
Nur einmal – beim Erstellen der Instanz. Ein mehrfacher Aufruf des Konstruktors ist nicht möglich.
Was passiert, wenn man versucht, eine zweite Instanz mit demselben Namen wie eine bereits existierende Instanz zu erzeugen?
Das führt zu einem Fehler, da die Objektidentität eindeutig sein muss.
Was passiert, wenn man beim Aufruf eines Konstruktors eine falsche Anzahl an Argumenten übergibt?
Es kommt zu einem Fehler, weil die Anzahl und Typen der Parameter exakt zu denen im Konstruktor passen müssen.
Was versteht man unter dem Überladen von Konstruktoren?
Das Überladen von Konstruktoren bedeutet, dass mehrere Konstruktoren mit unterschiedlichen Parameterlisten in derselben Klasse definiert werden können.
Was ist ein Destruktor?
Ein Destruktor ist eine spezielle Methode, die automatisch aufgerufen wird, wenn eine Instanz zerstört oder gelöscht wird.
Wann wird ein Destruktor aufgerufen?
Beim Freigeben einer Instanz (z. B. durch den Operator delete) oder beim Beenden des Programms.
Was passiert, wenn man versucht, auf ein privates Attribut von außen zuzugreifen?
Das Programm lässt sich nicht übersetzen; der Compiler gibt Fehlermeldungen aus.
Was ist der Zweck von Methoden wie arbeiten(), fressen(), wiegen() und init() in einer Klasse?
arbeiten()
fressen()
wiegen()
Sie stellen öffentliche Funktionen bereit, über die der interne Zustand (z. B. Gewicht, Sturheit) kontrolliert geändert oder abgefragt werden kann.
Warum kann das Schlüsselwort private manchmal weggelassen werden?
Weil Attribute und Methoden standardmäßig privat sind – private dient dann nur der besseren Lesbarkeit.
Was versteht man unter einer Instanz einer Klasse?
Ein konkretes Objekt, das nach dem Bauplan (der Klasse) erzeugt wurde.
Was besagt die Grundregel für den Umgang mit privaten und öffentlichen Vereinbarungen in Klassen?
So privat wie möglich, so öffentlich wie nötig.
Woran erinnert die Regel „So privat wie möglich, so öffentlich wie nötig“?
An die Regel „So lokal wie möglich, so global wie nötig“ bei lokalen und globalen Variablen.
Wie werden Attribute in einer Klasse normalerweise vereinbart?
Attribute werden in der Regel privat vereinbart.
Wie werden Methoden in einer Klasse normalerweise vereinbart?
Methoden werden in der Regel öffentlich vereinbart, da sie von außen aufgerufen werden sollen.
Wann sollte eine Methode privat sein?
Wenn sie nur innerhalb der Klasse verwendet wird und nicht von außen zugänglich sein muss.
Warum sollte man nicht alle Attribute und Methoden einer Klasse als public deklarieren?
Weil das gegen das Prinzip der Datenkapselung verstößt und zu schwer auffindbaren Fehlern führen kann.
Welche Folgen kann es haben, wenn alle Attribute öffentlich sind?
In größeren Projekten kann es zu unkontrollierten Zugriffen, unerwarteten Fehlern und schwerer Wartbarkeit führen.
Warum erscheint Datenkapselung am Anfang oft als überflüssige Arbeit?
Weil sie anfangs zusätzlichen Programmieraufwand erfordert und der Nutzen erst bei größeren Projekten sichtbar wird.
Frage: Wann erkennt man die Vorteile der Datenkapselung besonders deutlich?
Wenn man eine komplexe Klasse wiederverwenden oder in einem anderen Programm einsetzen möchte.
Welchen Vorteil bietet die konsequente Anwendung der Datenkapselung langfristig?
Sie spart Zeit und Aufwand, da gut gekapselte Klassen einfach wiederverwendbar sind.
Was bedeutet der Begriff protected in diesem Zusammenhang?
Protected heißt „geschützt“ und bezeichnet eine weitere Stufe der Sichtbarkeit zwischen private und public.
Wie lautet die zusammenfassende Regel für Attribute und Methoden in Klassen?
Attribute: so privat wie möglich
Methoden: so öffentlich wie nötig
Was versteht man unter Datenkapselung (encapsulation)?
Datenkapselung bedeutet, dass der direkte Zugriff auf die Attribute einer Klasse von außen verboten ist. Stattdessen erfolgt der Zugriff nur über Methoden der Klasse.
Warum sollte man Attribute nicht direkt von außen verändern?
Programme bleiben übersichtlicher und leichter zu warten.
Die Fehlersuche wird einfacher, da Fehlerquellen auf die betreffende Klasse beschränkt sind.
Welchen weiteren Vorteil bietet Datenkapselung neben der besseren Wartbarkeit?
Sie ermöglicht die problemlose Wiederverwendung von Klassen in anderen Programmen (z. B. Dialogfenster, Suchfunktionen).
Wie nennt man das Prinzip, das der Datenkapselung zugrunde liegt?
Das Geheimnisprinzip oder information hiding.
Worauf legt das Geheimnisprinzip besonderen Wert?
Auf das Was einer Klasse (ihre Funktionalität), nicht auf das Wie (ihre interne Umsetzung).
Wie wird in C++ die Datenkapselung technisch umgesetzt?
Durch die Festlegung der Sichtbarkeit (Visibility) von Attributen und Methoden mit Schlüsselwörtern wie private und public.
: Was bedeutet die Sichtbarkeit eines Attributs oder einer Methode?
Sie legt fest, von welchen Stellen im Programm aus auf das Element zugegriffen werden darf.
Frage: Welche Sichtbarkeiten kennt C++ für Klassenmitglieder?
private → Zugriff nur innerhalb der Klasse
public → Zugriff auch von außen (Es gibt außerdem protected, das hier aber nicht behandelt wird.)
Wie lautet die Standard-Sichtbarkeit in einer C++-Klasse?
Standardmäßig sind alle Attribute und Methoden privat, wenn keine Sichtbarkeit angegeben ist.
Wie wird in C++ ein Attribut öffentlich gemacht?
Mit dem Schlüsselwort public: vor der Attribut- oder Methodenliste.
public:
Wie lange gilt eine Sichtbarkeitsangabe (public, private)?
Sie gilt ab ihrer Deklaration bis zur nächsten Sichtbarkeitsangabe oder bis zum Ende der Klasse.
Was passiert, wenn man in einer Klasse nur public einmal verwendet?
Alle danach deklarierten Attribute und Methoden sind öffentlich, bis eine neue Sichtbarkeit folgt oder die Klasse endet.
Wie sollte man die Reihenfolge der Sichtbarkeiten in einer Klasse gestalten?
Zuerst die privaten Attribute und Methoden, danach die öffentlichen. So bleibt die Klasse übersichtlich.
Warum ist es sinnvoll, mit privaten Attributen zu beginnen?
Wenn man versehentlich public vergisst, sind die Attribute automatisch privat – ein sicherer Standard.
Wie wird ein Attribut wieder als privat deklariert, nachdem public verwendet wurde?
Durch die erneute Angabe von private: in der Klassenvereinbarung.
private:
Können Sichtbarkeiten in einer Klasse beliebig oft wechseln?
Ja, public und private können in beliebiger Reihenfolge und Häufigkeit verwendet werden.
Wie sieht eine typische Struktur einer Klasse in C++ unter Beachtung der Datenkapselung aus?
class Beispiel {
int attribut1;
double attribut2;
void methode1();
int methode2();
};
Welche Bestandteile einer Klasse sind häufig privat und welche öffentlich?
Attribute → privat
Methoden → öffentlich
Warum sind Attribute meist privat und Methoden öffentlich?
So kann der interne Zustand der Klasse nur über klar definierte Schnittstellen (Methoden) verändert werden.
Was ist eine einfach verkettete Liste?
Eine einfach verkettete Liste ist eine Datenstruktur, bei der jedes Element auf das nächste Element der Liste zeigt. Jedes Element enthält Daten und einen Zeiger (next) auf das nächste Element.
next
Welche Attribute und Methoden enthält die Klasse Listenelement?
Listenelement
Attribute:
string daten → speichert den Inhalt des Elements
string daten
Listenelement* next → Zeiger auf das nächste Listenelement
Listenelement* next
Methoden:
void datenSetzen(string datenneu) → setzt die Daten und next auf nullptr
void datenSetzen(string datenneu)
nullptr
void anhaengen(string datenneu) → hängt ein neues Element am Ende der Liste an
void anhaengen(string datenneu)
void ausgeben() → gibt die Liste von diesem Element aus
void ausgeben()
void freigeben() → gibt den Speicher der gesamten Liste frei
void freigeben()
Was macht die Methode datenSetzen()?
datenSetzen()
Sie setzt das Attribut daten auf den übergebenen Wert und next auf nullptr. Dies wird genutzt, um das erste Element zu initialisieren, ohne direkt auf die Attribute zuzugreifen.
daten
Frage: Wie funktioniert die Methode anhaengen()?
anhaengen()
Prüft, ob next == nullptr:
next == nullptr
Ja: Neues Element erstellen, Daten setzen, next = nullptr
next = nullptr
Nein: Methode rekursiv auf next aufrufen
Die Methode nutzt Rekursion, um das Ende der Liste zu finden, anstatt eine Schleife mit einem Hilfszeiger.
Rekursion bedeutet, dass die Methode sich selbst aufruft, wobei der vorherige Aufruf im Stack gespeichert bleibt.
Wie wird in anhaengen() das Ende der Liste gefunden?
Bei Strukturen: Über eine while-Schleife mit einem Hilfszeiger
Bei Klassen/Objekten: Über Rekursion (if … else prüft next)
if … else
Rekursion ruft die Methode für next auf, bis next == nullptr erreicht ist
Was kann bei falscher Rekursion passieren?
Wenn die Abbruchbedingung fehlt oder falsch ist, endet die Rekursion nie
Folge: Stack Overflow, da jeder Aufruf auf dem Stack gespeichert wird
Wie gibt die Methode ausgeben() die Liste aus?
ausgeben()
Gibt daten des aktuellen Elements aus
Prüft, ob next != nullptr
next != nullptr
Ruft rekursiv ausgeben() für das nächste Element auf
Wie wird der Speicher einer verketteten Liste freigegeben?
Ruft rekursiv freigeben() für das nächste Element auf
freigeben()
Löscht dann das nächste Element (delete next)
delete next
Im Hauptprogramm wird das erste Element ebenfalls gelöscht (delete listenanfang)
delete listenanfang
Was passiert beim Anhängen mehrerer Elemente?
Erstes Element erstellen (datenSetzen)
datenSetzen
Neues Element anhängen (anhaengen):
anhaengen
Wenn next == nullptr → direkt anhängen
Wenn nicht → rekursiver Aufruf
Daten werden von Element zu Element weitergegeben, bis das Ende erreicht ist
Warum ist die objektorientierte Version besser als die Strukturversion?
Kapselt Daten und Methoden in einer Klasse
Vermeidet direkten Zugriff auf Attribute von außen
Rekursion ersetzt externe Hilfszeiger und Schleifen
Einfachere Wartung und Erweiterung
Was passiert, wenn eine Methode rekursiv aufgerufen wird, bevor die vorherige Anweisung abgeschlossen ist?
Die vorherige Anweisung wird nicht gelöscht, sondern unterbrochen.
Nach Abschluss des rekursiven Aufrufs wird die unterbrochene Anweisung fortgesetzt.
Dies führt zu einem Stapel (Stack) von wartenden Methodenaufrufen, der in umgekehrter Reihenfolge abgearbeitet wird.
Was passiert beim Anhängen eines neuen Elements an eine Liste mit zwei Elementen?
Methode anhaengen() wird für Element 1 aufgerufen.
next von Element 1 ist nicht nullptr → Methode wird rekursiv für Element 2 aufgerufen.
Element 2 hat next == nullptr → neues Element wird erzeugt und Daten gesetzt.
Rückkehr zu Element 1 → vorherige Anweisung (cout) wird ausgeführt.
cout
Wie wird Speicher bei rekursiven Methoden freigegeben?
Rekursion geht zuerst ans Ende der Liste.
Danach werden die Elemente von hinten nach vorne gelöscht, während die wartenden Methoden vom Stack abgearbeitet werden.
Wie funktioniert die Methode ausgeben() bei rekursiven Listen?
Gibt die Daten des aktuellen Elements aus.
Ruft sich rekursiv für next auf, bis next == nullptr (Ende der Liste).
Die Verarbeitung beginnt immer beim Listenanfang, da listenanfang nicht verändert wird.
listenanfang
Welche Rolle spielt listenanfang in der rekursiven Liste?
Zeigt stets auf den Anfang der Liste.
Methoden wie anhaengen(), ausgeben(), freigeben() starten immer am Anfang.
Die Bewegung durch die Liste erfolgt über Rekursion auf next.
Wie wechselt das aktive Element bei Rekursion?
Durch den rekursiven Aufruf mit next wird das nächste Element aktiv.
Das ursprüngliche Element bleibt auf dem Stack und wartet, bis die Rekursion abgeschlossen ist.
Welche Gefahren bestehen bei endlosen oder sehr langen Rekursionen?
Stack Overflow, wenn die Abbruchbedingung fehlt oder Listen sehr groß sind.
Lösung: Rekursion durch Schleifen ersetzen, ähnlich wie bei der Struktur-Version der Liste.
Wie kann die Methode ausgeben() ohne Rekursion umgesetzt werden?
Hilfszeiger auf die aktuelle Instanz setzen (this).
Mit einer while-Schleife über next gehen und Daten ausgeben.
Vermeidet Überlauf bei großen Listen.
Was ist Rekursion und worauf sollte man achten?
Rekursion: Aufruf einer Methode oder Funktion durch sich selbst.
Wichtig:
Abbruchbedingung definieren
Stack Overflow vermeiden
Reihenfolge der Verarbeitung beachten (letztes Element zuerst, erstes Element zuletzt)
Wofür steht die Farbe Rot im Film?
Leidenschaft, Liebe, Begehren
Gefahr, Gewalt, Wut
Energie und Intensität 👉 Beispiel: „American Beauty“ – die roten Rosen symbolisieren Liebe und Obsession.
Welche Wirkung hat Orange in Filmen?
Was bedeutet „Zusammenarbeit zwischen Methoden“ in der objektorientierten Programmierung?
Methoden verschiedener Objekte können sich gegenseitig aufrufen und miteinander interagieren, um gemeinsam eine Aufgabe zu erfüllen.
Wie wird Zusammenarbeit zwischen Objekten in C++ technisch ermöglicht?
Durch Zeiger oder Referenzen, mit denen ein Objekt auf ein anderes zugreifen und dessen Methoden aufrufen kann.
Was ist eine Instanz einer Klasse?
Eine Instanz ist ein konkretes Objekt, das auf Basis einer Klassenbeschreibung erstellt wurde und über eigene Werte für die Attribute verfügt.
Warum verwendet man Zeiger auf Objekte innerhalb einer Klasse?
Damit ein Objekt auf andere Objekte des gleichen oder eines anderen Typs zugreifen kann — etwa um deren Methoden aufzurufen oder Daten zu ändern.
Welche Aufgabe kann eine Methode haben, die einen Zeiger auf ein anderes Objekt entgegennimmt?
Sie kann dadurch eine Beziehung oder Verbindung zwischen Objekten herstellen oder Operationen über mehrere Objekte hinweg ausführen.
Wie unterscheidet sich eine Methode, die ein anderes Objekt verwendet, von einer normalen Funktion?
Eine Methode wird im Kontext eines Objekts ausgeführt und kann auf dessen Attribute zugreifen; eine normale Funktion steht außerhalb von Klassen.
Wie können Objekte voneinander „wissen“, dass sie zusammenarbeiten sollen?
Durch Übergabe von Zeigern oder Referenzen aufeinander — typischerweise über eine Methode wie verbindenMit() oder einen Konstruktorparameter.
verbindenMit()
Welche Vorteile bietet die Zusammenarbeit zwischen Methoden mehrerer Objekte?
Erhöhte Flexibilität
Aufteilung komplexer Aufgaben auf mehrere spezialisierte Objekte
Bessere Wartbarkeit und Erweiterbarkeit des Codes
Was sollte man beim Arbeiten mit Zeigern zwischen Objekten beachten?
Zeiger müssen gültig sein (nicht auf gelöschte Objekte zeigen).
Beziehungen sollten klar definiert und symmetrisch gesetzt werden, falls nötig.
Speicher muss korrekt verwaltet oder mit Smart Pointern abgesichert werden.
Was passiert, wenn ein Objekt eine Methode eines anderen Objekts aufruft?
Das aufrufende Objekt wechselt den Ausführungskontext zur Methode des anderen Objekts und übergibt ggf. Parameter; Rückgabewerte werden danach im eigenen Kontext weiterverarbeitet.
Warum kann es sinnvoll sein, Rückgabewerte von Methoden zu verwenden, die auf andere Objekte wirken?
Damit das aufrufende Objekt Informationen über den Erfolg oder das Ergebnis der Aktion erhält und seinen eigenen Zustand entsprechend anpassen kann.
Was versteht man unter „einseitiger“ und „beidseitiger“ Verbindung zwischen Objekten?
Einseitig: Nur ein Objekt kennt das andere.
Beidseitig: Beide Objekte haben Referenzen oder Zeiger aufeinander und können gegenseitig Methoden aufrufen.
Was ist der Unterschied zwischen Attributen und Methoden in einer Klasse?
Attribute: Speichern Daten (Zustand).
Methoden: Definieren das Verhalten und die Verarbeitung dieser Daten.
Wie kann man durch Methodenaufrufe zwischen Objekten Abhängigkeiten vermeiden?
Durch klar definierte Schnittstellen (Public-Methoden).
Nutzung von Kapselung, um interne Details zu verbergen.
Übergabe nur notwendiger Informationen.
Wie kann eine Methode prüfen, ob eine Operation zwischen Objekten möglich ist?
Durch Bedingungen (if-Anweisungen), die z. B. Grenzen, Zustände oder Ressourcenverfügbarkeit der beteiligten Objekte überprüfen.
if
Welche Rolle spielt der Rückgabewert einer Methode bei der Zusammenarbeit von Objekten?
Er kann dem aufrufenden Objekt mitteilen, ob eine Aktion erfolgreich war oder in welchem Umfang sie ausgeführt wurde.
Wie können mehrere Methoden zusammenarbeiten, um eine komplexe Aufgabe zu lösen?
Eine Methode kann Teilaufgaben an andere Methoden (eigene oder fremde Objekte) delegieren; durch diese Aufgabenteilung entsteht ein Zusammenspiel mehrerer Komponenten.
Warum ist Kapselung wichtig bei der Zusammenarbeit von Methoden?
Sie schützt die internen Daten eines Objekts und erlaubt nur definierte Zugriffe über öffentliche Methoden, wodurch unbeabsichtigte Änderungen verhindert werden
elche Alternativen gibt es zur Zusammenarbeit über direkte Zeigerverweise?
Nutzung von Smart Pointern (shared_ptr, unique_ptr)
shared_ptr
unique_ptr
Ereignis-/Signal-Systeme
Observer-/Listener-Muster
Abstraktion über Schnittstellen oder Basisklassen
Was ist das wichtigste Lernziel bei der Zusammenarbeit zwischen Methoden?
Zu verstehen, wie Objekte miteinander kommunizieren, Informationen austauschen und gemeinsam Zustände verändern, um ein System als Ganzes funktionsfähig zu machen.
Was passiert, wenn man versucht, einen unique_ptr zu kopieren?
Das ist nicht erlaubt – unique_ptr kann nur verschoben (move) werden, nicht kopiert.
Was muss man beim Zugriff auf Methoden über Zeiger beachten?
Vor dem Operator -> muss der Bezeichner des Zeigers stehen, nicht der Klassenname.
Welche Syntax führt zu einem Fehler: Autoklasse->init(); oder auto1->init();?
Autoklasse->init();
auto1->init();
Autoklasse->init(); führt zu einem Fehler, da Autoklasse nur der Klassenname, aber keine Instanz ist.
Autoklasse
Wie initialisiert man eine dynamisch erzeugte Instanz im Beispielprogramm?
Mit auto1->init();
auto2->init();
Was ist das Ergebnis, wenn man im Beispiel auto1->gasgeben(20); ausführt?
auto1->gasgeben(20);
Die Geschwindigkeit von auto1 wird um 20 erhöht.
auto1
Was bedeutet „dynamisches Erzeugen von Instanzen“?
Beim dynamischen Erzeugen werden Objekte einer Klasse zur Laufzeit (also während das Programm läuft) mit dem Operator new erstellt – im Gegensatz zur statischen Erzeugung, die zur Compile-Zeit erfolgt.
Wie wird eine Instanz einer Klasse dynamisch erzeugt?
Mit dem Operator new und dem Klassennamen: Autoklasse* auto1 = new Autoklasse();
Was wird bei new Autoklasse() aufgerufen?
new Autoklasse()
Der Standardkonstruktor der Klasse wird aufgerufen.
Wie greift man auf Methoden einer dynamisch erzeugten Instanz zu?
Über den Pfeiloperator ->, z. B. auto1->init();
Wofür steht der Pfeiloperator -> in C++?
Er kombiniert Dereferenzierung und Zugriff auf eine Methode oder ein Attribut eines Objekts, auf das ein Zeiger zeigt.
Wie löscht man eine dynamisch erzeugte Instanz wieder?
Mit dem Operator delete, z. B. delete(auto1);
Was passiert, wenn ein Zeiger auf eine Instanz keinen gültigen Wert hat und verwendet wird?
Das führt meist zu einem Programmabsturz, weil auf ungültigen Speicher zugegriffen wird.
Warum darf man in auto3->init(); einen Fehler erwarten, wenn auto3 keine dynamisch erzeugte Instanz ist
auto3->init();
auto3
Weil auto3 kein Zeiger ist, sondern ein normales Objekt. Der Operator -> funktioniert nur mit Zeigern.
Wie greift man bei einer nicht-dynamischen Instanz auf eine Methode zu?
Mit dem Punktoperator ., z. B. auto3.init();
.
Wie kann man eine dynamisch erzeugte Instanz ohne den Pfeiloperator aufrufen?
Durch Dereferenzierung: (*auto3).init();
Was sind „intelligente Zeiger“ in C++?
Das sind Klassen (z. B. unique_ptr, shared_ptr), die automatisch die Speicherfreigabe übernehmen, wenn das Objekt nicht mehr benötigt wird.
Wie wird eine Instanz mit einem intelligenten Zeiger erzeugt?
Mit make_unique: unique_ptr<Autoklasse> auto1 = make_unique<Autoklasse>();
make_unique
Was ist der Vorteil von intelligenten Zeigern gegenüber new/delete?
Sie vermeiden Speicherlecks, weil sie den Speicher automatisch freigeben, wenn der Zeiger außerhalb seines Gültigkeitsbereichs liegt.
Wann wird delete bei unique_ptr benötigt?
Gar nicht – unique_ptr ruft delete automatisch auf, wenn der Zeiger zerstört wird.
Was ist ein unique_ptr?
Ein intelligenter Zeiger, der alleinigen Besitz („unique ownership“) über ein Objekt hat. Es kann nur einen unique_ptr pro Objekt geben.
Wird der Methodenkopf bei der Definition außerhalb der Klasse mit einem Semikolon abgeschlossen?
Nein, nur in der Klassendeklaration steht ein Semikolon – nicht bei der Implementierung.
Müssen Rückgabetyp und Parameterliste bei der Implementierung mit der Deklaration übereinstimmen?
Ja, sie müssen vollständig identisch sein. Rückgabetyp und Parameter dürfen nicht verändert werden.
Warum muss in der Methodendefinition ein Bezeichner für jeden Parameter angegeben werden?
Weil die Methode sonst die Parameter im Rumpf nicht ansprechen oder verarbeiten kann.
Was macht die Methode bremsen(int aenderung) in der Klasse Autoklasse?
bremsen(int aenderung)
Sie verringert die Geschwindigkeit um den Wert aenderung, aber nicht unter 0: if ((geschwindigkeit - aenderung) < 0)
aenderung
geschwindigkeit = 0;
else
geschwindigkeit -= aenderung;
Muss beim Zugriff auf ein Attribut der Klassenname angegeben werden?
Nein, der Compiler erkennt automatisch, dass geschwindigkeit ein Attribut der Klasse ist.Man kann aber Autoklasse::geschwindigkeit schreiben – das ist jedoch unüblich und unübersichtlich.
geschwindigkeit
Autoklasse::geschwindigkeit
Was ist der Unterschied zwischen einer Klasse und einer Instanz?
Klasse: Bauplan (Definition).
Instanz: Ein konkretes Objekt, das nach dem Bauplan erstellt wird.
Wie wird eine Instanz einer Klasse erzeugt?
Durch Deklaration mit dem Klassennamen als Typ: Autoklasse auto1;
Autoklasse auto2;
Welche zwei Möglichkeiten gibt es, Instanzen zu erzeugen?
Direkt (wie bei Strukturen): Autoklasse auto1;
Autoklasse auto1;
Dynamisch mit Zeigern oder Smartpointern (im nächsten Kapitel behandelt).
Was passiert nach diesen Anweisungen?
Wie greift man auf eine Methode einer Instanz zu?
Über den Punktoperator: auto1.init();
auto2.gasgeben(20);
Warum muss man bei Methodenaufrufen die runden Klammern immer angeben?
Ohne Klammern interpretiert der Compiler den Namen als Attribut, nicht als Methode.Beispiel:auto1.init; → Fehler, da init kein Attribut ist.
auto1.init;
init
Warum funktioniert Autoklasse.init(); nicht?
Autoklasse.init();
Weil Autoklasse die Klasse ist, keine Instanz. Methoden können nur über Objekte aufgerufen werden.
: Was würde passieren, wenn geschwindigkeit als public deklariert wäre?
Man könnte direkt darauf zugreifen, z. B.: auto1.geschwindigkeit = 30;
Das ist aber schlechter Programmierstil, da es die Datenkapselung verletzt.
Warum sollte man nicht direkt auf Attribute zugreifen?
Erhöht Fehleranfälligkeit (ähnlich wie globale Variablen).
Man verliert Überblick über Änderungen.
Verstößt gegen das Prinzip der Datenkapselung.
Wie sollte man stattdessen auf Attribute zugreifen?
Immer über Methoden (z. B. Getter/Setter). Beispiel für einen Getter: int Autoklasse::getGeschwindigkeit() {
return geschwindigkeit;
Wie ruft man einen Getter auf?
cout << auto1.getGeschwindigkeit();
int wert = auto2.getGeschwindigkeit();
Frage: Wie ruft man einen Getter auf?
Was passiert, wenn eine lokale Variable denselben Namen wie ein Attribut hat?
Die lokale Variable überdeckt das Attribut. Der Compiler arbeitet immer mit dem lokalsten Symbol.
: Beispiel: Was passiert im folgenden Code?
void Ueberdeckt::zeichenketteAendern(string zeichenkette) {
zeichenkette = zeichenkette + " geaendert";
Hier wird nur die lokale Variable zeichenkette verändert, nicht das Attribut der Klasse. Das Attribut bleibt leer.
zeichenkette
Wie kann man in diesem Fall trotzdem auf das Attribut zugreifen?
Mit dem this-Zeiger: this->zeichenkette = zeichenkette + " geaendert";
Warum ist der this-Zeiger nützlich?
Er ermöglicht den Zugriff auf das Attribut, wenn eine lokale Variable denselben Namen trägt.
Wie kann man das Problem mit überdeckten Namen vermeiden?
Durch unterschiedliche Bezeichner für Attribute und lokale Variablen.
Was passiert, wenn man sich bei ähnlichen Namen vertippt?
Man kann versehentlich das Attribut mit sich selbst überschreiben, was keine Wirkung hat, aber schwer zu erkennen ist.Beispiel: this->zKette = zKette; // Tippfehler: sollte zKette1 heißen
Wodurch wird eine Klasse eingeleitet und abgeschlossen?
Eingeleitet mit class, abgeschlossen mit };
class
Was entspricht die Methodenauflistung in einer Klasse?
Einem Funktionsprototyp.
Wo stehen die eigentlichen Methodendefinitionen meist?
Außerhalb der Klassenvereinbarung (oft in einer separaten .cpp-Datei).
.cpp
Wie erfolgt der Zugriff auf Methoden einer Instanz?
Instanzname.Methodenname(Parameter);
Wofür wird der this-Zeiger verwendet?
Um auf Attribute zuzugreifen, die denselben Namen wie lokale Variablen haben.
Was ist eine Klasse in C++?
Eine Klasse ist ein Bauplan für Objekte. Sie definiert, welche Attribute (Daten) und Methoden (Funktionen) die Objekte haben.
Was ist ein Objekt in C++?
Ein Objekt ist eine Instanz einer Klasse, also ein konkretes Exemplar, das nach dem Bauplan der Klasse erstellt wird.
Wie wird eine Klasse in C++ eingeleitet?
Mit dem Schlüsselwort class gefolgt vom Klassennamen und einem Block in geschweiften Klammern.
Frage: Wie wird eine Klasse abgeschlossen?
Antwort: Mit einer schließenden geschweiften Klammer und einem Semikolon (};).
Frage: Wie lautet die Klassendefinition im Beispiel?
class Autoklasse {
int geschwindigkeit;
void init();
void bremsen(int aenderung);
void gasgeben(int aenderung);
void ausgeben();
Welches Attribut besitzt die Klasse „Autoklasse“?
Antwort: Das Attribut int geschwindigkeit;, welches die aktuelle Geschwindigkeit des Autos speichert.
Wofür steht das Schlüsselwort public?
t: Es kennzeichnet Methoden oder Attribute, auf die auch von außen (außerhalb der Klasse) zugegriffen werden kann.
: Können Methoden auch innerhalb der Klassendefinition implementiert werden?
a, möglich. Oft werden sie aber außerhalb der Klassendefinition implementiert, um die Übersichtlichkeit zu verbessern.
Wie wird eine Methode außerhalb der Klasse definiert?
Mit dem Schema Rückgabetyp Klassenname::Methodenname(…) { … }.
Rückgabetyp Klassenname::Methodenname(…) { … }
: Was macht die Methode init()?
t: Sie setzt die Geschwindigkeit des Autos auf 0.
Frage: Was macht die Methode gasgeben(int aenderung)?
gasgeben(int aenderung)
Sie erhöht die Geschwindigkeit um den übergebenen Wert (geschwindigkeit = geschwindigkeit + aenderung;).
geschwindigkeit = geschwindigkeit + aenderung;
Was macht die Methode bremsen(int aenderung)?
Sie verringert die Geschwindigkeit um den übergebenen Wert, aber nicht unter 0.
Was macht die Methode ausgeben()?
Sie gibt die aktuelle Geschwindigkeit des Autos auf dem Bildschirm aus.
Wie sehen die Methodendeklarationen aus?
Wie könnten bremsen() und gasgeben() alternativ vereinbart werden?
bremsen()
gasgeben()
void bremsen(int);
void gasgeben(int);
Wie werden Objekte der Klasse „Autoklasse“ erzeugt?
: Wie werden Objekte initialisiert?
Durch Aufruf der Methode init():
auto1.init();
auto2.init();
Wie ruft man eine Methode eines Objekts auf?
auto1.gasgeben(20);
auto2.bremsen(10);
Warum werden Methoden oft außerhalb der Klasse implementiert?
Antwort: Um den Code übersichtlicher zu halten und die Klassendefinition kompakt zu gestalten.
Warum wird das Semikolon nach der Klassendefinition benötigt?
Antwort: Es ist syntaktisch erforderlich, ähnlich wie bei Strukturen (struct).
struct
Frage: Wo werden Klassen und Methoden bei größeren Projekten meist gespeichert?
Klassendefinition → in einer Header-Datei (.h)
Methoden-Implementierung → in einer Quelldatei (.cpp)
Frage: Welchen Vorteil hat die Trennung in Header- und Quelldateien?
Antwort: Wiederverwendbarkeit und zentrale Pflege von Klassen.
Frage: Wie kann man mit dem Qt Creator eine Klasse automatisch erstellen?
Menü Datei → Neu → C++-Klasse → Klassennamen eingeben → Qt erstellt automatisch Header- und Quelldatei.
: Wie wird eine Methode außerhalb der Klasse definiert?
Mit dem Schema
Rückgabetyp Klassenname::Methodenname(Parameterliste) { … }
Was trennt den Klassennamen vom Methodennamen bei der Definition außerhalb der Klasse?
Antwort: Zwei Doppelpunkte (::), der sogenannte Scope-Operator.
::
Frage: Wird der Methodenkopf bei der Definition außerhalb der Klasse mit einem Semikolon abgeschlossen?
Antwort: Nein, nur in der Klassendeklaration steht ein Semikolon – nicht bei der Implementierung.
Was trennt man in prozeduralen Programmen normalerweise?
Daten (Variablen) und Verhalten (Funktionen), die mit den Daten arbeiten.
Warum entspricht die Trennung von Daten und Verhalten nicht dem menschlichen Denken?
Menschen betrachten Objekte meist als Ganzes – Daten (z. B. Größe, Farbe) und Verhalten (z. B. „kann fahren“) werden gemeinsam gesehen.
Was ist das Ziel der objektorientierten Programmierung?
Daten und Verhalten werden zusammengefasst und als Einheit – als Objekt – betrachtet.
Wie definiert man ein Objekt in der objektorientierten Programmierung?
Ein Objekt ist eine Einheit, die Daten (Zustand) und Verhalten (Operationen) zusammenfasst.
Welche zwei Bestandteile hat jedes Objekt?
Daten → beschreiben den Zustand des Objekts
Verhalten → beschreibt, was das Objekt tun kann
Welche Beispiele für Objekte gibt es?
Reale Objekte (z. B. Person, Auto, Computer) und programmtechnische Objekte (z. B. Dialogfenster).
Was ist der Dreh- und Angelpunkt der Objektorientierung?
Das Objekt.
Was kann das Verhalten eines Objekts bewirken?
Es kann den Zustand des eigenen Objekts oder den Zustand eines anderen Objekts verändern.
Nenne Beispiele für den Zustand eines Autos als Objekt.
Motor läuft/nicht, Position, Richtung, Geschwindigkeit, Farbe, Ölstand, Reifentiefe usw.
Nenne Beispiele für das Verhalten eines Autos als Objekt.
: Starten (Zündschlüssel drehen), Lenken (Lenkrad drehen), Beschleunigen (Gaspedal).
Was bedeutet Abstraktion bei Objekten?
Nur die Informationen, die für eine bestimmte Problemstellung wichtig sind, werden berücksichtigt; irrelevante Daten werden weggelassen.
Warum werden Objekte in Klassen zusammengefasst?
Um gleiche oder ähnliche Eigenschaften nicht für jedes Objekt neu definieren zu müssen.
Was beschreibt eine Klasse?
Den Bauplan für Objekte – mit gemeinsamen Eigenschaften (Attribute) und Verhalten (Methoden).
Was ist eine Klassenhierarchie?
Eine Struktur, bei der allgemeine Eigenschaften in einer Oberklasse definiert und spezifische Eigenschaften in Unterklassen ergänzt werden.
eispiel für eine Klassenhierarchie im Auto-Kontext?
Oberklasse: „Auto“ mit allgemeinen Eigenschaften (z. B. Position, Geschwindigkeit).Unterklassen: „Sportwagen“, „Geländewagen“ mit spezifischen Eigenschaften (z. B. Motorisierung, Karosserieform).
Was ist der Unterschied zwischen konkreten und abstrakten Klassen?
Konkrete Klassen: Von ihnen können Instanzen (Objekte) erzeugt werden.
Abstrakte Klassen: Dienen nur zur Verallgemeinerung, von ihnen können keine Instanzen erstellt werden.
Was ist eine Instanz?
Ein einzelnes Objekt, das aus einer Klasse erzeugt wird.
Frage: Kann ein Objekt während seiner Lebensdauer die Klasse wechseln?
Antwort: Nein, die Klassenzugehörigkeit bleibt unverändert.
Was bedeutet: „Eine Instanz ist ein Objekt genau einer Klasse“?
Jedes Objekt gehört ausschließlich einer bestimmten Klasse an.
Wie wird der Zustand eines Objekts beschrieben?
Durch Attribute und deren Werte (Attributwerte).
Beispiel für Attribut und Attributwert beim Objekt „Auto“?
Attribut: „geschwindigkeit“, Attributwert: 90 km/h.
Wie wird das Verhalten eines Objekts beschrieben?
Durch Methoden (auch Operationen genannt).
Was tun Methoden in der Regel?
ie ändern den Zustand eines Objekts, also die Attributwerte.
Wer darf den Wert eines Attributs ändern?
Grundsätzlich nur das Objekt selbst über seine Methoden.
Was versteht man unter Objektidentität?
Jedes Objekt hat eine eindeutige Identität, die es von anderen Objekten unterscheidet – auch wenn alle Attribute identisch sind.
Wie kann die Objektidentität dargestellt werden?
Durch einen eindeutigen Objektbezeichner (z. B. „Sportwagen 1“, „Sportwagen 2“).
Worin unterscheidet sich Objektidentität von Attributwerten?
Objektidentität bleibt immer eindeutig und unveränderlich; Attributwerte können sich ändern.
Warum sollte ein Objekt nicht direkt auf die Attribute eines anderen Objekts zugreifen?
Um die Kapselung zu wahren – Objekte sollen nur über definierte Schnittstellen kommunizieren.
Wie kommunizieren Objekte miteinander?
Über Nachrichten, die von einem Sender (Sender/Source) an einen Empfänger (Receiver) geschickt werden.
Was versteht man unter einem Protokoll bei der Objektkommunikation?
Die Menge aller Nachrichten, auf die ein Objekt reagieren kann – vergleichbar mit einer gemeinsamen Sprache.
Beispiel für Objektkommunikation in Programmen?
Ein Dialogfenster (Sender) schickt die Nachricht „Öffne Datei“ an das Programmfenster (Empfänger).
Welche Rolle hat der Sender bei einer Nachricht?
Er stößt die Ausführung an, muss aber nicht wissen, wie der Empfänger die Nachricht verarbeitet.
Welche zwei Arten von Nachrichten gibt es?
Operationsaufruf
Signal
Was ist ein Operationsaufruf?
Der Sender ruft direkt eine Methode des Empfängers auf – Empfänger führt die Operation aus.
: Was ist ein Signal?
Eine Nachricht wird abgesetzt, Empfänger entscheiden selbst, ob und wie sie reagieren.
Beispiel für ein Signal in der realen Welt?
Ampel auf Grün → sendet Signal an nächste Ampel. Diese entscheidet selbst, ob sie ebenfalls auf Grün schaltet.
Wo findet man Signale und Slots besonders häufig?
In grafischen Benutzeroberflächen (GUI-Programmierung).
Was ist sequenzielle Nachrichtenübertragung?
Nachricht wird von einem Objekt zum nächsten weitergereicht – nur ein Objekt ist jeweils aktiv.Beispiel: „Grüne Welle“ bei Ampeln.
Was ist parallele Nachrichtenübertragung?
Nachricht wird gleichzeitig an mehrere Empfänger geschickt, mehrere Objekte reagieren parallel.Beispiel: Mehrere Ampeln schalten gleichzeitig auf Rot.
Was ist synchrone Kommunikation?
Sender wartet, bis Empfänger Nachricht verarbeitet hat und ggf. Rückmeldung gibt.Beispiel: Suchanfrage mit direkter Ergebnisrückgabe.
Was ist asynchrone Kommunikation?
Sender wartet nicht, arbeitet weiter, während Empfänger Nachricht im Hintergrund bearbeitet.Beispiel: Hintergrundaktion, deren Ergebnis später zurückkommt.
Was sind spezielle Zeiger?
Zeigerarten wie Funktionszeiger oder typenlose Zeiger, die nicht ständig genutzt werden, aber bestimmte Probleme elegant lösen können.
Was ist ein Funktionszeiger?
Ein Zeiger, der auf die Adresse einer Funktion zeigt, sodass man Funktionen über denselben Zeigeraufruf ausführen kann.
Wie wird ein Funktionszeiger deklariert?
int (*rechnen)(int, int);
➡ Rückgabetyp + (*Zeigername) + Parameterliste.
Wie weist man einem Funktionszeiger eine Funktion zu?
Durch Zuweisung des Funktionsnamens ohne Klammern:
rechnen = addieren;
rechnen = multiplizieren;
Wie ruft man eine Funktion über einen Funktionszeiger auf?
cout << rechnen(5,5) << '\n';
➡ ohne Dereferenzierungsoperator *.
*
Was gibt folgender Code aus?
Erste Ausgabe: 10, zweite Ausgabe: 25.
10
25
Frage: Was ist der Vorteil von std::function?
std::function
ntwort: Erleichtert den Umgang mit Funktionszeigern, da Funktionen als Objekte behandelt werden können.
Frage: Wie wird std::function deklariert?
function<int(int,int)> rechnen = addieren;
Was ist ein typenloser Zeiger?
Antwort: Ein Zeiger auf void, der auf beliebige Typen zeigen kann.
Wie deklariert man einen typenlosen Zeiger?
*(int*)zeiger = 9;
Frage: Was muss man beim Dereferenzieren eines void*-Zeigers beachten?
void*
Antwort: Eine explizite Typumwandlung (Typecasting) ist zwingend erforderlich:
Frage: Warum ist *(int)zeiger = 9; falsch?
*(int)zeiger = 9;
Antwort: Weil hier nicht in einen Zeiger auf int, sondern in einen Wert von Typ int umgewandelt würde.
Frage: Wie gibt man den reservierten Speicher eines void* frei?
delete((int*)zeiger);
Frage: Wofür werden typenlose Zeiger genutzt?
Wenn ein Zeiger für unterschiedliche Datentypen genutzt werden soll oder der Typ erst zur Laufzeit bekannt ist.
Was bedeutet dynamische Speicherverwaltung?
Speicher wird erst zur Laufzeit eines Programms angefordert und kann auch wieder freigegeben werden.
Wie funktioniert die bisherige (statische) Speicherverwaltung?
Speicher wird für Variablen fest bei der Programmausführung reserviert. Lokale Variablen werden nach Funktionsende freigegeben, globale bleiben während der gesamten Laufzeit erhalten.
Welches Problem hat die statische Speicherverwaltung?
Man muss die benötigte Speichergröße vorab festlegen. Bei zu kleiner Obergrenze → Programmfehler, bei zu großer Obergrenze → Speicher wird verschwendet.
Beispiel: Warum ist ein Feld mit fester Obergrenze unflexibel?
Wenn z. B. ein Array auf 100 Elemente beschränkt ist, kann man nicht mehr speichern. Setzt man es auf 100000, wird viel ungenutzter Speicher blockiert.
Was ist eine Lösung für diese Probleme?
peicher dynamisch nur dann anfordern, wenn er gebraucht wird → z. B. über eine verkettete Liste.
Wofür dient new in C++?
new reserviert Speicher dynamisch und gibt die Adresse zurück, die einem Zeiger zugewiesen wird.
Frage: Wofür dient delete in C++?
Antwort: delete gibt zuvor mit new reservierten Speicher wieder frei.
Welche Datentypen können mit new reserviert werden?
Jeder Datentyp – der Typ beim new-Aufruf muss mit dem Zeigertyp übereinstimmen.
Was passiert, wenn man delete vergisst?
Es kommt zu einem Memory Leak (Speicher bleibt reserviert, bis das Programm beendet wird).
Was passiert nach delete mit dem Zeiger?
Der Zeiger enthält weiterhin die alte Adresse. Zugriff darauf führt zu Fehlern. → Lösung: Zeiger danach auf nullptr setzen.
: Muss man am Programmende Speicher explizit freigeben?
Nicht zwingend, da das Betriebssystem Speicher freigibt. Es ist aber gute Praxis, es selbst zu tun.
Frage: Was passiert, wenn man die Adresse eines Zeigers überschreibt, ohne sie vorher zu sichern?
Der alte Speicherbereich geht verloren und kann nicht mehr freigegeben werden.
: Warum war die zweite Beispiel-Liste unbrauchbar?
Weil der Zeiger in jeder Schleifeniteration überschrieben wurde → nur der letzte Eintrag bleibt zugreifbar.
Was riskiert man, wenn man new vergisst und trotzdem mit dem Zeiger arbeitet?
Der Zeiger hat keinen definierten Wert → Programmabsturz durch Zugriff auf unzulässigen Speicherbereich.
Was passiert, wenn man einen Zeiger ohne new verwendet?
Er hat einen undefinierten Wert → Zugriff führt fast immer zu Problemen.
Worauf muss man beim new-Operator achten?
Dass der richtige Typ angegeben wird – der Compiler prüft das
Was passiert, wenn man die Adresse in einem Zeiger überschreibt, ohne sie zu sichern?
Man verliert den Zugriff auf den Speicherbereich → es entsteht eine „Speicherleiche“ (Memory Leak).
Was ist bei nicht mehr benötigtem Speicher zu tun?
Mit delete freigeben.
Frage: Warum sollte man nach delete den Zeiger nicht dereferenzieren?
Antwort: Weil delete die Adresse nicht verändert. Zugriff führt zu Speicherschutzverletzung.
Gilt delete auch für andere Zeiger, die auf denselben Speicher zeigen?
Ja, die Freigabe betrifft alle Zeiger auf den Speicherbereich.
Was speichert ein Element einer einfach verketteten Liste?
Die Daten und einen Zeiger (next) auf das nächste Element.
Welchen Wert hat next im letzten Element?
nullptr (Ende der Liste).
Frage: Wozu dient der Zeiger listenanfang?
Antwort: Er speichert das erste Element der Liste, damit man die Liste immer wiederfinden kann.
Frage: Wie wird ein neues Element ans Ende der Liste angehängt?
Antwort: Mit einem Hilfszeiger durch die Liste wandern → hilfszeiger->next = new listenelement;.
hilfszeiger->next = new listenelement;
Frage: Wie werden die Elemente ausgegeben?
Antwort: Mit einem Hilfszeiger vom Anfang bis zum Ende durchlaufen, bis next == nullptr.
Warum wird die Liste beim Freigeben von vorne nach hinten abgebaut?
Weil man nur das Nachfolgeelement kennt, nicht das Vorgängerelement.
orteil gegenüber Arrays?
peicher wird nur bei Bedarf reserviert → hohe Flexibilität
Nachteil gegenüber Arrays?
Zusätzlicher Speicherbedarf für Zeiger und langsames Einfügen am Ende (durch Traversieren der Liste).
Frage: Wie lässt sich das Einfügen am Ende beschleunigen?
Antwort: Durch einen zusätzlichen Zeiger, der immer auf das Ende der Liste zeigt.
Warum kann man die Liste nur vorwärts durchlaufen?
Weil man nur den Nachfolger kennt, nicht den Vorgänger.
Frage: Wie nennt man eine Liste, die auch rückwärts durchlaufen werden kann?
Antwort: Doppelt verkettete Liste.
Frage: Was ist ein Smartpointer?
Antwort: Ein intelligenter Zeiger, der Speicher automatisch freigibt.
Frage: Welche zwei Typen von Smartpointern gibt es?
Antwort: unique_ptr (nur ein Zeiger erlaubt) und shared_ptr (mehrere Zeiger möglich).
Frage: Wie wird ein unique_ptr erzeugt?
Antwort: unique_ptr<Typ> zeiger = make_unique<Typ>();
unique_ptr<Typ> zeiger = make_unique<Typ>();
Frage: Wie wird ein shared_ptr erzeugt?
Antwort: shared_ptr<Typ> zeiger = make_shared<Typ>();
shared_ptr<Typ> zeiger = make_shared<Typ>();
Frage: Braucht man bei Smartpointern delete?
Antwort: Nein, Freigabe erfolgt automatisch.
Frage: Warum kann unique_ptr nicht für verkettete Listen genutzt werden?
Antwort: Weil mehrere Zeiger auf ein Element zeigen müssen → man braucht shared_ptr.
Was passiert, wenn zwei Zeiger auf dieselbe Variable zeigen?
Beide Zeiger liefern beim Dereferenzieren denselben Wert, da sie auf dieselbe Speicheradresse verweisen.
Was passiert, wenn zwei Zeiger auf dieselbe Adresse zeigen und dereferenziert werden?
Beide geben denselben Wert aus, da sie auf dieselbe Variable zeigen.
: Kann man den Wert einer Variablen über einen Zeiger ändern?
*zeiger = 100;
Warum ist der Dereferenzierungsoperator * bei einer Zuweisung über den Zeiger zwingend erforderlich?
Ohne * würde man versuchen, dem Zeiger selbst (der eine Adresse speichert) einen Wert zuzuweisen, was zu einem Typfehler führt.
: Was passiert bei der Anweisung zeiger = 100;?
zeiger = 100;
Compilerfehler: invalid conversion from 'int' to 'int'*, weil ein Wert statt einer Adresse zugewiesen wird.
Was passiert bei der Anweisung *zeiger = &100;?
*zeiger = &100;
Fehler, da die Konstante 100 keine Adresse im Speicher hat.
100
Was passiert bei *zeiger = &intVariable1;?
*zeiger = &intVariable1;
Fehler, weil *zeiger den Wert einer Variablen erwartet, aber eine Adresse (int*) zugewiesen wird.
*zeiger
int*
Wann arbeitet man mit einer Adresse, und wann mit einem Wert bei Zeigern?
Ohne *: Arbeit mit der Adresse (z. B. zeiger = &var;).
zeiger = &var;
Mit *: Arbeit mit dem Wert der Variablen (z. B. *zeiger = 100;).
Warum ist die Initialisierung von Zeigern wichtig?
Ein nicht initialisierter Zeiger enthält eine zufällige Adresse → Dereferenzieren führt fast immer zu einer Speicherschutzverletzung.
Wie initialisiert man einen Zeiger sicher?
Mit nullptr: int* zeiger = nullptr;
Wie prüft man, ob ein Zeiger gültig ist, bevor man ihn dereferenziert?
Mit einer if-Abfrage:
if (zeiger != nullptr) { ... }
Was passiert, wenn man einen nullptr dereferenziert?
: Das Programm stürzt mit einer Speicherschutzverletzung ab.
Wie vereinbart man eine Struktur in C++?
struct strukturtyp {
int inhalt1;
int inhalt2;
} struktur;
Wie positioniert man einen Zeiger auf eine Struktur?Antwort:
strukturzeiger = &struktur;
Wie greift man über einen Strukturzeiger auf ein Feld zu (lange Schreibweise)?
(*strukturzeiger).inhalt1 = 11;
Welchen Vorteil bietet der Operator -> bei Strukturzeigern?
Er ist eine kompaktere Schreibweise für (*zeiger).element. strukturzeiger->inhalt2 = 111;
(*zeiger).element
Frage: Warum sind Klammern bei (*strukturzeiger).inhalt wichtig?
(*strukturzeiger).inhalt
Ohne Klammern kann der Compiler nicht erkennen, was dereferenziert werden soll → Fehlermeldung.
Wann darf man den Operator -> verwenden?
Nur beim Zugriff auf Mitglieder einer Struktur über einen Strukturzeiger.
Wie greift man auf Mitglieder einer normalen Struktur zu?
Mit dem Punktoperator .
struktur.inhalt1;
Wie greift man auf Mitglieder einer Struktur über einen Zeiger zu?
Mit dem Pfeiloperator ->
strukturzeiger->inhalt1;
Unterscheiden sich die Ergebnisse beim Zugriff mit . und ->?
Nein, beide liefern denselben Wert – der Unterschied liegt nur in der Zugriffsform.
Was passiert bei der Anweisung intzeiger = &strukturzeiger->inhalt1;?
intzeiger = &strukturzeiger->inhalt1;
Zuerst wird strukturzeiger dereferenziert.
strukturzeiger
Dann wird die Adresse des Mitglieds inhalt1 ermittelt.
inhalt1
Diese Adresse wird dem Zeiger intzeiger zugewiesen.
intzeiger
Wie gibt man den Wert von inhalt1 über intzeiger aus?
Mit Dereferenzierung:
cout << *intzeiger;
Was ist ein Zeiger (Pointer) in C++?
Ein Zeiger ist eine Variable, die nicht einen Wert speichert, sondern die Adresse einer anderen Variablen.
Wie unterscheidet sich der Zugriff über Variablen und Zeiger?
Direkter Zugriff: über den Variablennamen.
Indirekter Zugriff: über die Adresse der Variablen mithilfe eines Zeigers.
Wofür steht das Kleiderschrank-Beispiel?
Schrank = Arbeitsspeicher
Schublade = Variable (Speicherplatz)
Kleidungsstück = Wert der Variablen
Liste mit Verweisen = Adressen
Finger auf Liste = Zeiger
Was ist der Vorteil von Zeigern?
Sie ermöglichen flexiblen und indirekten Zugriff auf Speicherbereiche, erlauben Mehrfachverweise und sind notwendig für komplexe Strukturen wie verkettete Listen.
Wie sieht die allgemeine Syntax für einen Zeiger aus?
typ *bezeichner;
Was bedeutet das * bei der Vereinbarung eines Zeigers?
Es kennzeichnet die Variable als Zeiger auf einen bestimmten Datentyp.
Wie weist man einem Zeiger eine Adresse zu?
zeiger = &variable;
Was passiert, wenn man & beim Zuweisen vergisst?
an versucht, einen Wert statt einer Adresse einem Zeiger zuzuweisen → Compilerfehler: invalid conversion from 'int' to 'int'*.
ie greift man über einen Zeiger auf den Wert der Variablen zu?
cout << *zeiger;
Welche zwei Bedeutungen hat das * bei Zeigern in C++?
Bei der Deklaration: Zeigerdefinition (int *p;)
int *p;
Bei der Nutzung: Dereferenzierung (*p)
*p
Was ist der Unterschied zwischen cout << zeiger; und cout << *zeiger;?
cout << zeiger;
zeiger: gibt die Adresse der Variablen aus.
zeiger
*zeiger: gibt den Wert der Variablen an dieser Adresse aus.
Wie nennt man den Zugriff über *zeiger?
Dereferenzieren – indirekter Zugriff auf die Speicherstelle, auf die der Zeiger zeigt.
Frage: Was versteht man unter modularer Programmierung?
Die Aufteilung eines Programms in mehrere kleinere, logisch zusammenhängende Einheiten (Module), die separat entwickelt, getestet und später zusammengeführt werden.
Welche Probleme entstehen, wenn man große Programme in nur einer Datei speichert?
Langes Neukompilieren bei jeder Änderung
Funktionen müssen in andere Programme kopiert werden → doppelte Fehlerkorrekturen
Zusammenarbeit mehrerer Programmierer wird erschwert
Welche Eigenschaften hat ein Modul?
Eindeutig definierte Schnittstellen
Eindeutiger Zweck
Versteckt interne Details (Information Hiding)
Eigenständige Datei mit Quelltext von Funktionen
Kann getrennt entwickelt und getestet werden
Was bedeutet das „Geheimnisprinzip“ (Information Hiding)?
Nutzer eines Moduls kennen nur die Schnittstellen (Funktionsnamen, Parameter), nicht aber die interne Implementierung.
Was sind Funktionsprototypen?
: Vorab-Deklarationen von Funktionen, die dem Compiler Name und Parametertypen mitteilen, damit Aufrufe überprüft werden können, auch wenn die Funktion selbst später im Code definiert ist.
Wie sieht der Unterschied zwischen Funktionskopf und Funktionsprototyp aus?
Funktionskopf: int auswertung(int x, int y)
int auswertung(int x, int y)
Prototyp: int auswertung(int, int); (ohne Variablennamen, mit Semikolon)
int auswertung(int, int);
Wo werden Funktionsprototypen normalerweise platziert?
Direkt nach den #include- und using-Anweisungen, vor dem ersten Funktionsaufruf.
#include
using
Wozu dienen Header-Dateien (.h)?
Sie enthalten Funktionsprototypen, Konstanten und Datentypen eines Moduls, um den Zugriff auf ausgelagerte Funktionen in anderen Dateien zu ermöglichen.
: Was enthalten .cpp-Dateien im Vergleich zu .h-Dateien?
.cpp → Implementierung (Quelltext der Funktionen)
.h → Prototypen und Vereinbarungen (keine Funktionendefinitionen)
.h
Was bewirkt #include "datei.h"?
#include "datei.h"
Bindet eine selbst erstellte Header-Datei aus dem aktuellen Projektordner ein.
Warum werden bei Header-Dateien Präprozessor-Direktiven wie #ifndef, #define und #endif eingesetzt?
#ifndef
#define
#endif
Damit Header-Dateien nicht mehrfach eingebunden werden, was zu Fehlermeldungen führen würde.
: Was macht die Direktive #pragma once?
#pragma once
Sie verhindert mehrfaches Einbinden einer Header-Datei (Alternative zu #ifndef ... #define ... #endif), wird aber nicht von allen Compilern unterstützt.
#ifndef ... #define ... #endif
Was sind Präprozessor-Direktiven allgemein?
: Anweisungen an den Compiler, die vor der eigentlichen Übersetzung ausgeführt werden. Sie beginnen immer mit # (z. B. #include, #define).
#
Wie werden Werte eines Aufzählungstyps intern gespeichert?
Als ganze Zahlen, beginnend bei 0 (z. B. Montag = 0, Dienstag = 1, ...).
CKann man einer Enum-Variable direkt eine Zahl zuweisen?
Nein, nur mit Casting, z. B. meineWoche = static_cast<tage>(2);.
meineWoche = static_cast<tage>(2);
Was passiert, wenn man nur den Namen einer Strukturvariablen angibt?
Dann bezieht man sich auf alle Mitglieder gleichzeitig. So kann man z. B. eine Struktur in eine andere gleichen Typs kopieren.
Was sind Strukturen, Unions und Aufzählungstypen?
Es sind benutzerdefinierte Datentypen, die auf Standarddatentypen basieren und einen eigenen Namen erhalten.
Wofür werden Strukturen verwendet?
Um logisch zusammengehörige Daten unterschiedlicher oder gleicher Typen unter einem Bezeichner zusammenzufassen.
Wie wird eine Struktur vereinbart?
Mit struct <Name> { <Memberliste> };. Wichtig: Nach der schließenden Klammer muss ein Semikolon stehen.
struct <Name> { <Memberliste> };
s sind die zwei Schritte zur Nutzung einer Struktur?
Struktur vereinbaren (struct ...).
struct ...
Variable vom Typ der Struktur anlegen (z. B. kiste kleineKiste;).
kiste kleineKiste;
Wie greift man auf ein Mitglied einer Struktur zu?
Mit <Strukturvariable>.<Mitglied>, z. B. kleineKiste.breite.
<Strukturvariable>.<Mitglied>
kleineKiste.breite
Kann man für Strukturen Felder (Arrays) anlegen?
Ja, z. B. kiste lagerraum[80]; für 80 Elemente vom Typ kiste.
kiste lagerraum[80];
kiste
Vorteile von Strukturen?
Zusammengehörige Daten unter einem Bezeichner speichern.
Gemeinsame Verarbeitung der Daten über die Strukturvariable.
Was passiert, wenn man nur den Strukturnamen (z. B. kiste.breite) beim Zugriff verwendet?
kiste.breite
Fehler – der Strukturname ist ein Datentyp, kein Variablenname. Nur Strukturvariablen besitzen Mitglieder.
Wie kann man Werte an Mitglieder zuweiSENß
kleineKiste.breite = 2;
kleineKiste.hoehe = 1;
kleineKiste.laenge = 2;
Wie werden Strukturen an Funktionen übergeben?
Indem man die Strukturvariable als Argument übergibt – dadurch werden alle Mitglieder mitgegeben.
Was ist eine Union?
: Ein benutzerdefinierter Datentyp, der wie eine Struktur aufgebaut ist, aber immer nur einen Wert gleichzeitig speichern kann.
Was bleibt in einer Union nach mehreren Zuweisungen erhalten?
Nur der zuletzt zugewiesene Wert.
Was ist ein Aufzählungstyp (enum class)?
Ein benutzerdefinierter Typ, bei dem die möglichen Werte auf eine bestimmte Auswahl begrenzt sind.
Wie weist man einer Variablen vom Typ tage einen Wert zu?
tage
tage meineWoche = tage::Montag;
Wie werden Zeichenketten in C++ ausgegeben?
Mit cout << "Text"; – dies sind jedoch Konstanten und können nicht verändert werden.
cout << "Text";
Welches Problem gibt es in C++ mit Zeichenketten?
+C++ hat keinen eigenen Datentyp für Zeichenketten. Man verwendet stattdessen char-Felder (C-Strings) oder die Klasse string.
Was ist ein C-String?
Ein Feld vom Typ char, das eine geordnete Folge von Zeichen speichert und mit der Endekennung \0 abgeschlossen wird.
char
\0
Wie deklariert man ein char-Feld für eine Zeichenkette mit max. 5 Zeichen?
: char text[6]; – das 6. Feld ist für die Endekennung \0 reserviert.
char text[6];
Wie kann man ein char-Feld initialisieren?
Zeichenweise: char text[6] = {'H','a','l','l','o','\0'};
char text[6] = {'H','a','l','l','o','\0'};
Direkt: char text[6] = "Hallo"; – der Compiler setzt \0 automatisch.
char text[6] = "Hallo";
Warum ist die Endekennung \0 wichtig?
Sie markiert das Ende der Zeichenkette. Ohne sie gibt der Compiler zusätzlich "Zeichensalat" aus, bis zufällig ein \0 im Speicher gefunden wird.
Wie unterscheidet man in C++ zwischen Zeichen und Zeichenketten?
Ein Zeichen: 'a' (Apostrophe)
'a'
Eine Zeichenkette: "a" (Anführungszeichen, intern 2 Zeichen: a + \0).
"a"
Was passiert, wenn man die Größe beim char-Feld weglässt?
: Der Compiler ermittelt automatisch die richtige Länge. Beispiel:char text[] = "Hallo";
char text[] = "Hallo";
Kann man einem char-Feld nachträglich eine Zeichenkette direkt zuweisen?
: Nein, nur bei der Deklaration möglich. Nachträglich geht es nur zeichenweise oder über spezielle Funktionen.
Wie gibt man ein char-Feld mit cout aus?
Einfach den Namen des Feldes verwenden, z. B. cout << text; – der Compiler gibt automatisch alle Zeichen bis \0 aus.
cout << text;
Frage: Wie liest man ein char-Feld mit cin ein?
cin >> text; – dabei endet die Eingabe bei Leer- oder Tabulatorzeichen.
cin >> text;
Welches Problem gibt es beim Einlesen von Zeichenketten mit cin?Antwort:
cin
cin bricht die Eingabe bei Leer- oder Tabulatorzeichen ab.
cin prüft die maximale Länge nicht → Überlauf möglich.
Welche Alternative zu cin sollte man für Zeichenketten verwenden?
Die Methode cin.getline(), da sie Leerzeichen berücksichtigt und die maximale Länge begrenzen kann.
cin.getline()
Wie wird cin.getline() verwendet?
cin.getline(zeichenkette, 80);→ liest bis zu 79 Zeichen + Endekennung \0.
cin.getline(zeichenkette, 80);
Was muss man tun, wenn mehr Zeichen als erlaubt eingegeben werden?
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Warum muss man manchmal cin.getline() doppelt ausführen?
Weil noch ein \n von einer vorherigen Eingabe im Puffer steht.
\n
Warum kann man = oder == nicht direkt für char-Felder verwenden?
=
==
Der Feldname ist eine Adresse, nicht der Inhalt. Mit = oder == würden nur Adressen verglichen, nicht Zeichenketten.
Welche C-Funktionen helfen bei char-Feldern?
strcpy(ziel, quelle) → kopieren
strcpy(ziel, quelle)
strcmp(a, b) → vergleichen (liefert 0 bei Gleichheit)
strcmp(a, b)
0
strlen(text) → Länge einer Zeichenkette (ohne \0)
strlen(text)
arum wird strcmp() oft mit ! verwendet?
strcmp()
!
Weil strcmp() bei Gleichheit 0 liefert. Mit !strcmp(a, b) erhält man true, wenn die Zeichenketten identisch sind.
!strcmp(a, b)
true
Warum ist die Klasse string einfacher als char-Felder?
string
Kein manuelles Behandeln von \0.
Länge wird automatisch verwaltet.
Sichere Verarbeitung, weniger fehleranfällig.
Welche Operatoren kann man mit string verwenden?
Zuweisung =
Verkettung +
+
Vergleich ==, !=
!=
Wie erhält man die Länge eines string?
Mit stringVar.length().
stringVar.length()
Wie kann man Zeichen eines string einzeln ausgeben?
Mit Schleifen:
for (unsigned int i=0; i<str.length(); i++) cout << str[i];
Oder mit Range-For:
for (char z : str) cout << z;
Wie liest man eine komplette Zeichenkette (inkl. Leerzeichen) mit string ein?
Mit getline(cin, variable);.
getline(cin, variable);
Wie prüft man, ob ein string leer ist?
Mit der Methode .empty().
.empty()
Wie vergleicht man zwei string-Variablen genau?
Mit compare().
compare()
Rückgabewert 0 → gleich
0 → erstes abweichendes Zeichen von string1 ist größer
string1
<0 → erstes abweichendes Zeichen von string1 ist kleiner
Wie findet man ein Zeichen oder eine Teilzeichenkette in einem string?
Mit .find(zeichen) oder .find(zeichenkette).
.find(zeichen)
.find(zeichenkette)
: Was liefert .find() zurück?
.find()
Den Index des ersten Vorkommens oder string::npos, wenn nichts gefunden wurde.
string::npos
Wie zählt man alle Vorkommen eines Zeichens?
Mit einer Schleife, die wiederholt ab dem letzten Treffer sucht.
Beispiel:
while ((index = text.find(c, index+1)) != string::npos) zaehler++;
Was ist ein Feld (Array) in C++?
Ein Feld fasst mehrere Variablen desselben Typs zu einer Einheit zusammen.
Wie nennt man Felder auf Englisch?
Arrays.
Können in einem Feld unterschiedliche Datentypen gespeichert werden?
Nein, nur Variablen vom gleichen Typ.
Welches Konzept wird benutzt, wenn man verschiedene Datentypen zusammenfassen will?
Strukturen (struct).
Wie werden die einzelnen Elemente in einem Feld identifiziert?
Durch einen Index (laufende Nummer).
Wie lautet die allgemeine Syntax zur Deklaration eines Felds in C++?
Typ Bezeichner[Anzahl];
Wie heißen die Variablen in einem Feld?
Feldelemente oder kurz Elemente.
Wofür steht der Index in einem Feld?
Er gibt die eindeutige Position eines Elements im Feld an.
Womit wird der Zugriff auf ein Element eines Feldes beschrieben?
Mit dem Feldnamen und dem Index, z. B. Feldname[2].
Feldname[2]
Muss die Anzahl der Elemente eines Felds in C++ festgelegt werden?
Ja, die Größe muss bei der Vereinbarung angegeben werden und kann später nicht verändert werden.
Welche flexibleren Alternativen zu Feldern gibt es in C++?
Die Klassen vector und array.
vector
array
Wie wird ein Feld in C++ deklariert?
Beispiel: int zahlen[10]; erstellt ein Feld mit 10 int-Werten.
int zahlen[10];
Bei welchem Index beginnt ein Feld?
Wie lautet der Index des letzten Elements in einem Feld mit n Elementen?
n
n - 1.
n - 1
Ist der Zugriff auf zahlen[10] gültig, wenn int zahlen[10]; deklariert wurde?
zahlen[10]
Nein, das letzte gültige Element ist zahlen[9].
zahlen[9]
Warum laufen Schleifen beim Arbeiten mit Feldern oft von 0 bis < n?
< n
Weil der erste Index 0 und der letzte Index n - 1 ist.
Wie kann ein Feld direkt bei der Deklaration initialisiert werden?
Mit geschweiften Klammern, z. B. int zahlenFeld[5] = {1, 2, 3, 4, 5};.
int zahlenFeld[5] = {1, 2, 3, 4, 5};
Kann ein Feld nach der Deklaration mit einer Initialisierungsliste neu belegt werden?
Nein, eine solche Zuweisung führt zu einem Compilerfehler.
Muss bei der Initialisierung die Feldgröße immer angegeben werden?
Nein, der Compiler kann die Größe aus der Anzahl der Werte in den geschweiften Klammern ableiten. Beispiel: int zahlenFeld[] = {1, 2, 3};.
int zahlenFeld[] = {1, 2, 3};
Können Feldelemente wie normale Variablen verwendet werden?
Ja, sie können verglichen, berechnet oder als Funktionsparameter übergeben werden.
Was passiert, wenn man auf ein Element außerhalb der Feldgrenzen zugreift?
Der Compiler meldet keinen Fehler, aber das Programm gibt zufällige Werte zurück oder stürzt ab.
Warum überprüft C++ Feldgrenzen nicht automatisch?
Weil ein Feld intern nur ein Zeiger auf den Speicherbereich ist, der das erste Element enthält.
Was ist besonders gefährlich an Überschreitungen der Feldgrenzen?
Schreibzugriffe können geschützte Speicherbereiche überschreiben und Programmabstürze verursachen.
Warum ist das Überschreiten von Feldgrenzen in C++ gefährlich?
Weil es nicht immer zu einem Absturz führt, sondern auch unbemerkt falsche Werte liefern kann.
: Welche Schleifenform kann man nutzen, um ein Feld ohne Indizes zu durchlaufen?
Die range-based for-Schleife (for (int element : feld)).
for (int element : feld)
Was macht die Variable in einer range-based for-Schleife?
Sie nimmt bei jedem Durchlauf den Wert des aktuellen Elements im Feld an.
Wie deklariert man ein zweidimensionales Feld in C++ mit 4 Spalten und 8 Zeilen?
int tabellenFeld[4][8];
Wo beginnt der Index bei mehrdimensionalen Feldern?
Immer bei 0 in jeder Dimension.
Wie greift man auf die 3. Spalte und 4. Zeile eines zweidimensionalen Feldes zu?
Mit tabellenFeld[2][3].
tabellenFeld[2][3]
Warum ist tabellenFeld[1] nicht gültig?
tabellenFeld[1]
Weil bei mehrdimensionalen Feldern immer alle Dimensionen angegeben werden müssen.
Wie kann man ein mehrdimensionales Feld initialisieren?
Mit geschachtelten geschweiften Klammern, z. B.int tabellenFeld[2][4] = { {3,5,7,6}, {2,1,0,9} };
int tabellenFeld[2][4] = { {3,5,7,6}, {2,1,0,9} };
Was ist bei sehr großen mehrdimensionalen Feldern zu beachten?
Sie benötigen viel Speicher, da alle Dimensionen multipliziert werden.
Wie übergibt man ein Feld an eine Funktion?
Indem man nur den Feldnamen (ohne eckige Klammern) angibt → Übergabe der Startadresse.
Was bedeutet call by reference bei Feldern?
Änderungen am übergebenen Feld wirken sich direkt auf das Original aus, da die Adresse übergeben wird.
: Worin unterscheidet sich call by reference von call by value?
call by reference → Übergabe der Adresse, Original wird verändert.
call by value → Übergabe einer Kopie, Original bleibt unverändert.
Kann man ein Feld direkt einem anderen zuweisen (z. B. aFeld = bFeld;)?
aFeld = bFeld;
Nein, das ist nicht erlaubt.
Wie kopiert man den Inhalt eines Felds in ein anderes?
Mit einer Schleife, die jedes Element einzeln zuweist.
Worauf muss man beim Kopieren von Feldern achten?
Das Zielfeld muss mindestens so groß sein wie das Quellfeld, da C++ keine Grenzen prüft.
Definition Lokale Variable
Eine lokale Variable wird innerhalb eines Anweisungsblocks vereinbart. Sie ist nur in dem Block bekannt, in dem sie vereinbart wird.
Was ist eine lokale Variable?
Eine lokale Variable wird innerhalb eines Anweisungsblocks vereinbart und ist nur in diesem Block bekannt.
Woran erkennt man verschiedene Anweisungsblöcke?
Sie sind durch geschweifte Klammern { ... } abgegrenzt.
{ ... }
Kann man in main() eine Variable varA vereinbaren, obwohl es schon in gibVarAus() eine gibt?
varA
gibVarAus()
Antwort: Ja, das geht, weil jede lokale Variable nur im eigenen Anweisungsblock gilt.
Wie lautet der wichtige Merksatz zu lokalen Variablen?
Eine lokale Variable ist nur innerhalb des Anweisungsblocks sichtbar, in dem sie vereinbart wurde.
Haben die beiden Variablen varA in gibVarAus() und main() etwas miteinander zu tun?Antwort: Nein
Nein. Sie sind völlig unabhängig, da sie in verschiedenen Anweisungsblöcken lokal vereinbart wurden.
Was passiert mit lokalen Variablen, wenn ein Anweisungsblock verlassen wird?
Sie werden gelöscht, und auch ihre gespeicherten Werte gehen verloren.
Wenn mehrere lokale Variablen mit demselben Namen existieren, auf welche wird zugegriffen?
: Auf die aktuell gültige, also die lokalste Variable im jeweiligen Anweisungsblock
Wie wird der Bezugsrahmen einer Variablen bestimmt?
Durch den Anweisungsblock (geschweifte Klammern), in dem die Variable vereinbart wurde.
Warum tritt im Beispiel mit produkt ein Compilerfehler auf?
produkt
Weil produkt nur im if-Block gültig ist und außerhalb nicht bekannt ist.
Welche Variablen aus dem Beispiel sind auch im if-Block gültig?
Die Variablen zahl1 und zahl2, weil sie im Anweisungsblock der Funktion main() deklariert wurden.
zahl1
zahl2
Was bedeutet ein "sehr enger Bezugsrahmen"?
Die Sichtbarkeit einer Variablen ist auf einen kleinen Anweisungsblock, z. B. einen if-Block, beschränkt.
: Wie verhält sich die Schleifenvariable in einer for-Schleife bezüglich ihres Bezugsrahmens?
for
Sie ist nur innerhalb der Schleife gültig und außerhalb unbekannt.
Was ist die wichtigste Regel zu lokalen Variablen?
Lokale Variablen existieren nur innerhalb ihres Anweisungsblocks und werden beim Verlassen des Blocks gelöscht.
Wo müssen globale Variablen vereinbart werden?
Außerhalb aller Funktionen, also auch außerhalb von main().
Wodurch unterscheiden sich globale und lokale Variablen in ihrer Lebensdauer?
Globale Variablen bleiben bis zum Ende des Programms erhalten, lokale Variablen werden beim Verlassen ihres Anweisungsblocks gelöscht.
Was passiert, wenn eine globale Variable in einer Funktion verändert wird?
Der neue Wert bleibt auch nach Verlassen der Funktion erhalten, weil die globale Variable nicht gelöscht wird.
Können lokale und globale Variablen denselben Namen haben?
Ja, solange sie in unterschiedlichen Bezugsrahmen liegen. Die lokalere Variable überdeckt dann die globalere.
Welche Variable wird bei gleichnamigen globalen und lokalen Variablen standardmäßig verwendet?
Immer die lokalere Variable.
Wie kann man trotz gleichnamiger lokaler Variable auf die globale Variable zugreifen?
Mit dem Bezugsrahmenoperator ::, z. B. ::varA.
::varA
Was bewirkt das Schlüsselwort static bei einer lokalen Variablen?
static
Die Variable behält ihren Wert auch nach Verlassen des Anweisungsblocks und bleibt für die gesamte Programmlaufzeit erhalten.
Ist eine static-Variable trotzdem lokal?
Ja, der Zugriff ist weiterhin nur innerhalb der Funktion oder des Blocks möglich, in dem sie vereinbart wurde.
Worin kombiniert eine static-Variable Eigenschaften von lokalen und globalen Variablen?
Sie hat lokalen Zugriff wie eine lokale Variable, aber eine Lebensdauer wie eine globale Variable.
Welche Vorteile haben globale Variablen?
Man kann Werte ohne Übergabe zwischen Funktionen teilen.
Welche Nachteile haben globale Variablen?
Programme werden unübersichtlich und fehleranfällig.
Sie widersprechen der Datenkapselung in der objektorientierten Programmierung.
Was ist die wichtigste Regel im Umgang mit Variablen?
So lokal wie möglich, so global wie nötig.
Sollten Scope-Operator (::) und static oft genutzt werden?
Nein, nur wenn es keine andere Möglichkeit gibt.
Warum sind Funktionen in C++ nützlich?
Sie vermeiden doppelten Code, machen Programme übersichtlicher und ermöglichen es, einmal geschriebenen Code mehrfach zu verwenden
Was ist der Funktionskopf in C++?
Die erste Zeile einer Funktion:Rückgabetyp Name (Parametertypen)Die erste Zeile einer Funktion:Rückgabetyp Name (Parametertypen)
Rückgabetyp Name (Parametertypen)
Woraus besteht der Funktionskopf?
Aus Rückgabetyp, Funktionsnamen und Parametern (in runden Klammern).
Was ist der Funktionskörper in C++?
Ein Block aus Anweisungen in geschweiften Klammern, der beim Funktionsaufruf ausgeführt wird.
Welche Regeln gelten für Funktionsnamen?
Beginn mit Buchstaben oder _.
_
Dürfen Buchstaben, Ziffern und _ enthalten.
Groß-/Kleinschreibung unterscheidet.
Nicht identisch mit Schlüsselwörtern.
Was bedeutet der Rückgabetyp void?
Die Funktion liefert keinen Wert zurück.
Welche Funktion ist Pflicht in jedem C++-Programm?
Antwort: main() – sie ist die Hauptfunktion und Startpunkt des Programms.
Wie werden Funktionen in C++ aufgerufen?
Mit ihrem Namen gefolgt von einer Argumentliste in runden Klammern, z. B. ausgabe1();.
ausgabe1();
: Was sind Argumente bei einem Funktionsaufruf?
Konkrete Werte, die beim Aufruf an die Funktion übergeben werden.
Können Funktionen in C++ innerhalb anderer Funktionen definiert werden?
Nein, die Vereinbarung einer Funktion muss außerhalb anderer Funktionen erfolgen.
Was ist bei Funktionsdefinition und -aufruf immer zwingend erforderlich, auch wenn keine Parameter übergeben werden?
ie runden Klammern () – sie dürfen niemals weggelassen werden.
()
Was passiert, wenn man beim Aufruf einer Funktion die Klammern vergisst?
Der Compiler übersetzt das Programm trotzdem (oft mit Warnung), aber die Funktion wird nicht aufgerufen.
Was passiert nach der Ausführung einer Funktion?
Das Programm kehrt automatisch an die Stelle des Aufrufs zurück und läuft dort weiter.
Wie gibt eine Funktion in C++ einen Wert zurück?
Mit dem Schlüsselwort return und dem Wert dahinter.
return
Was passiert nach einem return in einer Funktion?
Die Funktion wird sofort beendet, nachfolgende Anweisungen werden nicht mehr ausgeführt.
Was passiert, wenn man bei einer Funktion keinen Rückgabetyp angibt?
Standardmäßig wird int angenommen (sollte aber unbedingt vermieden werden).
Kann eine Funktion in C++ mehrere Werte gleichzeitig zurückgeben?
Nein, mit Standardtechniken kann nur ein einziger Wert zurückgegeben werden.
Was muss bei Funktionen mit Rückgabewert immer sichergestellt sein?
Dass in jedem Fall ein definierter Wert über return zurückgegeben wird.
Wovon hängt der Typ des zurückgegebenen Wertes ab?
Ausschließlich vom Rückgabetyp der Funktion – nicht vom Typ der Variablen im return.
Was passiert, wenn der Rückgabewert nicht in jedem Fall eindeutig definiert ist?
Der Compiler gibt eine Warnung aus, und das Programm liefert möglicherweise undefinierte Werte.
nterschied zwischen Parameter und Argument?
Parameter = Platzhalter im Funktionskopf.
Argument = konkreter Wert, der beim Aufruf übergeben wird.
: Wie sieht der Funktionskopf einer Funktion mit Parameter aus?
int quadrat(int zahl)
Wann wird die Variable eines Parameters initialisiert?
Automatisch beim Aufruf der Funktion mit dem übergebenen Argument.
: Kann man als Argument nur Variablen übergeben?
: Nein, auch Ausdrücke (z. B. a*b/c) oder direkte Werte (z. B. 10) sind möglich.
a*b/c
Wovon hängt es ab, wie ein Wert an eine Funktion übergeben wird?
Von der Vereinbarung des Parameters im Funktionskopf, nicht vom Argument beim Aufruf.
Was passiert, wenn im Funktionskopf ein Parameter als int vereinbart ist, das Argument aber ein float ist?
Es wird trotzdem nur ein int übergeben, da der Parameter-Typ maßgeblich ist.
Wie übergibt man mehrere Argumente an eine Funktion?
Indem man die Argumente in den Klammern beim Aufruf durch Kommas trennt und im Funktionskopf eine erweiterte Parameterliste angibt.
Wie lautet ein Beispiel für eine Funktion mit zwei Parametern?
Funktionskopf: int summe(int x, int y)Aufruf: summe(a, b);
int summe(int x, int y)
summe(a, b);
: Muss man für jeden Parameter den Typ einzeln angeben?
Ja, die Schreibweise int summe(int x, y) wird vom Compiler nicht akzeptiert.
int summe(int x, y)
Welche Schreibweise für die Rückgabe ist möglich, wenn ein berechenbarer Ausdruck wie x + y vorliegt?
x + y
Kurzform: return (x + y); anstatt
return (x + y);
int ergebnis; ergebnis = x + y; return ergebnis;
Welche Funktion hat das kleine Dreieck im Qt Creator neben jedem Funktionskopf?
Es kann den Funktionskörper ein- oder ausblenden, um den Quelltext kompakter darzustellen.
: Wie kann man im Qt Creator schnell zwischen Funktionen wechseln?
Über das Kombinationsfeld rechts oben im Editor, in dem alle Funktionen aufgelistet sind.
: Worauf muss man bei Parametern und Argumenten besonders achten?
Anzahl und Typ müssen übereinstimmen. Der Bezeichner ist beliebig.
Wozu dienen Schleifen in C++?
Sie wiederholen Anweisungen im Schleifenkörper abhängig von Bedingungen.
Wie nennt man die Bedingungen, die eine Schleife steuern?
Abbruchbedingungen (im Text oft einfach „Bedingung“ genannt).
Wie interpretiert C++ Abbruchbedingungen?
Wenn die Bedingung wahr ist, wird die Schleife ausgeführt; wenn sie falsch ist, wird sie beendet.
Welche drei Schleifentypen gibt es in C++?
Kopfgesteuerte Schleife (Bedingung am Anfang)
Fußgesteuerte Schleife (Bedingung am Ende)
Zählschleife (Sonderfall der kopfgesteuerten Schleife)
Welche zwei Befehle gibt es zur Steuerung von Schleifen?
break und continue.
break
continue
Was ist eine Endlosschleife?
Eine Schleife, die sich unendlich oft wiederholt und nicht automatisch endet.
Welche Gefahr besteht bei Fehlern in Schleifen?
Es kann eine Endlosschleife entstehen, die manuell abgebrochen werden muss.
Wie lautet die Syntax einer while-Schleife?
while (Bedingung) // Schleifenkopf
Anweisung1;
Anweisung2;
...
} // Schleifenkörper
Wann wird die Bedingung in einer while-Schleife überprüft?
Vor jedem Schleifendurchlauf im Schleifenkopf.
Was passiert, wenn man hinter den Schleifenkopf ein Semikolon setzt?
Die Schleife wird endlos, da nur der Ausdruck wiederholt überprüft wird.
Was ist eine Schleifenvariable?
Eine Variable, die im Ausdruck der Schleife überprüft wird.
Worauf muss man bei einer Schleifenvariablen achten?
Sie muss korrekt initialisiert werden.
Sie muss innerhalb der Schleife verändert werden.
Was passiert, wenn die Schleifenvariable nicht verändert wird?
Es entsteht eine Endlosschleife, da die Bedingung immer gleich bleibt.
Frage: Wie unterscheidet sich die do … while-Schleife von der while-Schleife?
Bei do … while wird die Bedingung erst am Ende (im Schleifenfuß) überprüft.
Was bedeutet „fußgesteuerte Schleife“?
Die Bedingung steht im Schleifenfuß, d. h. die Auswertung erfolgt nach dem Schleifenkörper.
Was ist der wichtigste Unterschied zur while-Schleife?
Der Schleifenkörper wird mindestens einmal ausgeführt, unabhängig von der Bedingung.
Wie lautet die Syntax einer do … while-Schleife?
do {
Anweisungen; // Schleifenkörper
} while (Bedingung); // Schleifenfuß mit Semikolon
Was passiert, wenn man das Semikolon am Ende der do … while-Schleife weglässt?
Der Compiler meldet einen Syntaxfehler.
Wann sollte man eine do … while-Schleife einsetzen?
Wenn sichergestellt werden soll, dass die Schleife mindestens einmal durchlaufen wird.
Welche typische Anwendung hat die do … while-Schleife?
Häufig beim Einlesen von Benutzereingaben, da die Eingabe vor der Bedingungsprüfung erfolgt.
Muss die Schleifenvariable bei einer do … while-Schleife vor der Schleife initialisiert werden?
Nein, da sie im ersten Durchlauf innerhalb der Schleife gesetzt werden kann.
Was verhindert im Beispiel mit Benutzereingabe eine Endlosschleife?
Die Schleifenvariable wird durch cin im Schleifenkörper bei jeder Eingabe verändert.
Wie kann man eine do … while-Schleife in eine while-Schleife umwandeln?
Das do wird entfernt, und die Bedingung aus dem Schleifenfuß wird in den Schleifenkopf geschrieben (ohne abschließendes Semikolon).
do
Ist die Wahl zwischen while und do … while immer strikt notwendig?
Nein, oft ist es eine Frage des persönlichen Geschmacks, aber do … while eignet sich besonders für Eingaben.
Wann verwendet man typischerweise eine for-Schleife?
Wenn die Anzahl der Schleifendurchläufe bereits vor Beginn bekannt ist.
Wie lautet die Grundsyntax einer for-Schleife in C++?
for (Vorlauf; Bedingung; Nachlauf)
Anweisung;
Welche drei Ausdrücke stehen im Kopf einer for-Schleife?
Vorlauf (Initialisierung, z. B. i = 0;)
i = 0;
Bedingung/Testausdruck (z. B. i <= 10;)
i <= 10;
Nachlauf (z. B. i++;)
i++;
Wie oft wird der Vorlauf in einer for-Schleife ausgeführt?
Genau einmal, bevor die Schleife startet.
Wann wird der Testausdruck in einer for-Schleife überprüft?
Vor jedem Schleifendurchlauf.
Wann wird der Nachlauf in einer for-Schleife ausgeführt?
Am Ende jedes Schleifendurchlaufs.
Worin liegt der Vorteil der for-Schleife gegenüber der while-Schleife?
Die Steuerung der Schleife (Initialisierung, Bedingung, Änderung) ist kompakt und übersichtlich im Schleifenkopf zusammengefasst.
Wo ist eine in der for-Schleife deklarierte Variable sichtbar?
Nur innerhalb der Schleife (lokaler Gültigkeitsbereich).
Was sollte man bei der Bedingung einer Schleife beachten?
Sie muss gültig sein, sonst droht eine Endlosschleife.
Was gilt als schlechter Programmierstil bei for-Schleifen?
Die Schleifenvariable zusätzlich im Schleifenkörper zu verändern.
: Warum ist es problematisch, die Schleifenvariable innerhalb der Schleife zu
Weil es das erwartete Verhalten verändert und den Code für andere Programmierer verwirrend macht.
Wofür wird die Anweisung break in Schleifen verwendet?
Um die Schleife sofort komplett zu beenden. Danach wird das Programm mit der nächsten Anweisung nach der Schleife fortgesetzt.
ann ist der Einsatz von break sinnvoll?
Nur in Kombination mit einer Bedingung, z. B. wenn bei einer bestimmten Eingabe die Schleife beendet werden soll.
Was ist eine Flag-Variable?
Eine Variable, die einen Zustand markiert (z. B. true oder false), um den Ablauf einer Schleife zu steuern.
false
Wie kann man eine Schleife ohne break beenden?
Indem man eine Flag-Variable in die Schleifenbedingung integriert und sie bei Bedarf verändert.
Was ist der Vorteil einer Flag-Variable gegenüber break?
Der Code wird übersichtlicher, da die Bedingungen für den Abbruch direkt im Schleifenkopf sichtbar sind.
Was bewirkt die Anweisung continue in einer Schleife?
Sie beendet nur den aktuellen Schleifendurchlauf und springt direkt zur nächsten Überprüfung der Bedingung.
Unterschied break vs. continue?
break: beendet die gesamte Schleife.
continue: überspringt nur den aktuellen Durchlauf.
Worauf muss man bei continue besonders achten?
Die Schleifenvariable muss vor dem continue verändert werden, sonst drohen Endlosschleifen.
Wann sollte man continue besser vermeiden?
Wenn eine einfache if-Abfrage dasselbe Ergebnis erzielen kann – das macht den Code oft übersichtlicher.
Können break und continue auch in for-Schleifen verwendet werden?
Ja, aber dann ist der Schleifenablauf schwerer direkt aus dem Schleifenkopf erkennbar. Deshalb sollte man sie sparsam und gut kommentiert einsetzen.
ie kann man ungültige Eingaben (z. B. Buchstaben statt Zahlen) in C++ abfangen?
Mit cin.fail(). Bei Fehlern:
cin.fail()
Eingabestatus mit cin.clear() zurücksetzen,
cin.clear()
Eingabepuffer mit cin.ignore(numeric_limits<streamsize>::max(), '\n') leeren.
cin.ignore(numeric_limits<streamsize>::max(), '\n')
Was ist der Zweck von Kontrollstrukturen in Programmen?
Kontrollstrukturen steuern den Ablauf von Programmen. Sie ermöglichen es, Anweisungen abhängig von Bedingungen auszuführen oder gezielt zu wiederholen, anstatt sie nur in der Reihenfolge auszuführen, in der sie im Quelltext stehen.
Was bedeutet eine einfache if-Verzweigung?
Eine einfache if-Verzweigung („wenn … dann“) führt eine oder mehrere Anweisungen nur aus, wenn eine bestimmte Bedingung erfüllt ist.
Wie sieht ein Beispiel für eine einfache if-Verzweigung im Alltag aus?
Tagesablauf:
Aufstehen
Arbeiten
Nach Hause gehen
WENN die Sonne scheint, DANN joggen
Abendessen kochen Wenn die Sonne nicht scheint, wird das Joggen übersprungen.
Wie werden mehrere Anweisungen innerhalb einer if-Verzweigung zusammengefasst?
Mehrere Anweisungen werden in einem Anweisungsblock mit geschweiften Klammern {} zusammengefasst.
{}
Was darf nicht hinter dem Ausdruck in einer if-Anweisung stehen?
Ein Semikolon (;). Es würde die if-Anweisung von der auszuführenden Anweisung trennen, sodass die Bedingung keine Wirkung hat.
;
Was liefert die Bedingung in einer if-Anweisung zurück?
Die Bedingung liefert entweder true (wahr) oder false (falsch).
Was passiert, wenn man den Operator = anstelle von == in einer if-Bedingung verwendet?
= ist die Zuweisung und kein Vergleich. Die Bedingung wird möglicherweise immer wahr, da der Variablen ein Wert zugewiesen wird. Das führt zu unerwartetem Verhalten.
Was ist der Unterschied zwischen = und == in einer if-Bedingung?
= weist einer Variablen einen Wert zu.
== überprüft, ob zwei Werte gleich sind.
Wie zeigt man die if-Verzweigung grafisch in Lernmaterialien?
Mit Nassi-Shneiderman-Diagrammen (Struktogrammen).
e: Wie prüft der Compiler semantische Fehler in if-Bedingungen?
Der Compiler prüft hauptsächlich die Syntax, nicht die Semantik. Logische Fehler, wie die Verwechslung von = und ==, werden in der Regel nicht erkannt.
Wozu wird die if … else-Verzweigung verwendet?
Sie wird genutzt, wenn man für wahre Bedingungen eine Aktion ausführen möchte und für falsche Bedingungen eine andere Aktion. („wenn … dann – sonst“)
Was ist der Unterschied zwischen if und if … else?Antwort:
if: Aktion wird nur bei wahrer Bedingung ausgeführt, sonst passiert nichts.
if … else: Es wird immer eine Aktion ausgeführt – entweder im if-Zweig (wahr) oder im else-Zweig (falsch).
Wie kann man eine einfache if … else-Verzweigung in einer Zeile schreiben?
Mit dem ternären Operator ?::Bedingung ? Ausdruck_wahr : Ausdruck_falsch;
?:
Bedingung ? Ausdruck_wahr : Ausdruck_falsch;
Beispiel für den ternären Operator ?:?
Ergebnis: max ist a, wenn a > b wahr ist, sonst b.
max
a > b
b
Was ist eine geschachtelte if-Verzweigung?
Eine if-Anweisung innerhalb einer anderen if-Anweisung, um mehrere Bedingungen nacheinander zu prüfen.
Wie funktioniert eine geschachtelte if-Verzweigung?
Zuerst wird äußere Bedingung geprüft.
Ist sie wahr, wird die innere Bedingung geprüft.
Nur wenn beide wahr sind, wird die Anweisung ausgeführt.
ie kann man geschachtelte if-Anweisungen mit logischem UND (&&) ersetzen?Antwort:
&&
if (Bedingung1 && Bedingung2)
Nur ausgeführt, wenn beide Bedingungen wahr sind.
Wie funktioniert eine verschachtelte if … else-Kette?
if (Bedingung1): Anweisung1
if (Bedingung1)
else if (Bedingung2): Anweisung2
else if (Bedingung2)
else: Anweisung3 → Zuerst wird Bedingung1 geprüft, wenn falsch, Bedingung2 usw.
Warum sind Einrückungen bei verschachtelten if … else-Konstruktionen wichtig?
Sie erhöhen die Lesbarkeit und verhindern Missverständnisse, welcher else-Zweig zu welcher if-Anweisung gehört.
Wozu dient die switch … case-Anweisung?
switch … case
Um auf verschiedene Werte einer Variablen gezielt zu reagieren. Sie ist eine Alternative zu vielen if … else if-Verzweigungen.
if … else if
Grundaufbau von switch … case?
switch (Ausdruck) {
case Wert1:
break;
case Wert2:
default:
Welche Datentypen sind für den switch-Ausdruck erlaubt?
Ganze Zahlen (int) oder Zeichen (char). Nicht erlaubt: Gleitkommazahlen oder Zeichenketten.
Welche Funktion hat break in einem case-Zweig?
Beendet die Ausführung des aktuellen case-Zweigs. Ohne break werden alle nachfolgenden case-Anweisungen ebenfalls ausgeführt (Fallthrough).
Was passiert, wenn kein default vorhanden ist?
default
Wird kein case-Zweig zutreffend, passiert nichts. Ein default ist optional, aber empfohlen, um undefinierte Zustände zu vermeiden.
Wie behandelt man Groß- und Kleinbuchstaben in switch … case?
case 'A':
case 'a':
cout << "Aktion";
Können switch … case-Konstruktionen geschachtelt werden?
Ja, z. B. um Hauptfälle in weitere Unterfälle zu untergliedern. Sehr sorgfältig arbeiten, da vergessene breaks schwer zu debuggen sind.
Warum sollte man die Schachtelung von if … else und switch … case begrenzen?
Zu viele Ebenen machen den Code schnell unübersichtlich und schwer wartbar.
Wann sollte man switch … case anstelle von if … else verwenden?
Wenn man Mehrfachauswahlen programmieren möchte und die Werte auf ganze Zahlen oder char reduziert werden können. Für Zeichenketten oder Gleitkommazahlen muss man geschachtelte if … else verwenden.
Welche Rolle spielt break in switch … case-Konstruktionen?
break beendet die Ausführung des aktuellen case-Zweigs. Ohne break würden alle nachfolgenden case-Anweisungen ebenfalls ausgeführt (Fallthrough).
Was passiert, wenn die Konstanten in den case-Zweigen nicht zum Typ des switch-Ausdrucks passen?
Der Compiler findet keine passende case-Marke, und es wird ggf. immer der default-Zweig ausgeführt.Beispiel: Eine Zahl als '1' (Zeichen) passt nicht zu einem int-Ausdruck.
'1'
Warum sollte man bei geschachtelten if … else-Konstruktionen sorgfältig mit Klammern umgehen?
Um den Überblick zu behalten und Fehler zu vermeiden. Der Compiler prüft nur die Syntax, nicht die logische Struktur der Klammern.
Was prüft der Compiler bei Klammern in geschachtelten if … else-Anweisungen?
Nur, ob jede öffnende Klammer { auch eine schließende Klammer } hat. Die logische Zuordnung der Klammern zu if/else wird nicht geprüft.
Worauf muss man bei if … else-Konstruktionen besonders achten?
Darauf, zu welchem if ein else gehört, um die Ausführung richtig zu steuern.
Bedeutung Vergleichsoperatoren ==
Es wird überprüft, ob die beiden Operanden gleich sind
Bedeutung Vergleichsoperator =!
Es wird überprüft, ob die beiden Operanden ungleich sind.
Bedeutung Vergleichsoperator <
Es wird überprüft, ob der linke Operand kleiner ist als der rechte Operand.
Bedeutung Vergleichsoperator >
Es wird überprüft, ob der linke Operand größer ist als der rechte Operand.
Bedeutung Vergleichsoperator < =
Es wird überprüft, ob der linke Operand kleiner oder gleich dem rechten Operanden ist.
Bedeutung Vergleichsoperatoren > =
Es wird überprüft, ob der linke Operand größer oder gleich dem rechten Operanden is
Wichtiger Faktor Vergleichsoperator ==
Der Vergleichsoperator == besteht aus zwei Zeichen. Achten Sie sorgfältig darauf, dass Sie ihn nicht mit dem Zuweisungsoperator = verwechseln. Merken Sie sich daher: Der Vergleichsoperator == besteht aus zwei Zeichen, der Zuweisungsoperator = nur aus einem Zeichen.
Wichtige Regel für die Reihenfolge von Operatoren
Achten Sie bei Ihren Programmen daher immer auf richtige Klammerung von Operatoren.
Bedeutung logischer Operator !
Logische Verneinung (NICHT, NOT)
Logischer Operator &&
Logisches Und (UND, AND)
Bedeutung logischer Operator II
Logisches Oder (ODER, OR)
Wichtige Regel Syntax von logischen Operatoren
Die logischen Operatoren && und || bestehen aus zwei Zeichen und nicht aus einem. Mit den Operatoren & und | führen Sie bitweise Verknüpfungen durch. Damit wollen wir uns hier aber nicht weiter beschäftigen.
Lesbarkeit von Zahlen mit verschiedenen Dateitypen
Bei Zuweisungen zwischen Typen mit unterschiedlicher Genauigkeit ist die Genauigkeit höchstens so groß wie bei der Variablen mit der schlechtesten Genauigkeit, die an der Zuweisung beteiligt ist.
Anweisung zum Einlesen von Eingaben
cin >> eingabe;
Variable zum Ausgeben von Eingelesenen Daten über die Tastatur
Eingabe
Stream Operator zum Einlesen von Texten
Für das Einlesen müssen Sie den Stream-Operator >> verwenden und nicht wie bei der Ausgabe den Operator <<.
Abk cin
steht für console input (übersetzt etwa: „Konsoleneingabe“).
Aufgaben die Datentypen erfüllen
1. Der Compiler reserviert entsprechend Platz im Speicher des Computers. Damit wird automatisch auch der mögliche Wertebereich der Variablen festgelegt.
2. Der Compiler interpretiert die gespeicherten Informationen anhand des Typs. So kann er zum Beispiel unterscheiden, ob es sich bei den Daten um eine ganze Zahl oder eine Zahl mit Nachkommastellen handelt.
Definition binäre Darstellung
Diese Darstellung mit zwei Werten nennt man binäre Darstellung.
Definition Dualsystem
Das dazugehörige Zahlensystem heißt Dualsystem. Es arbeitet mit den beiden Ziffern 0 und 1 und dem Stellenwert 2. Eine Zahl wird durch Potenzen des Stellenwerts 2 dargestellt.
Definition Dezimal System
Das gewohnte Dezimalsystem arbeitet mit ähnlichen Verfahren wie das Dualsystem. Lediglich die verwendeten Ziffern und der Stellenwert unterscheiden sich. Im Dezimalsystem werden die Ziffern 0 bis 9 verwendet. Der Stellenwert ist 10. Die Zahl 365 wird im Dezimalsystem so dargestellt: 3 · 10^2 + 6 · 10^1 + 5 · 10^0 = 3 · 100 + 6 · 10 + 5 · 1
Übergeordnete Datentypen in C++
• ganze Zahlen
• Gleitkommazahlen
• einzelne Zeichen und Zeichenketten
• logische Werte wie wahr und falsch beziehungsweise true oder false.
Bedeutung wenn bei einem Datentyp unsigned ergänzt ist
Keine Vorzeichen (-) möglich
Datentyp für logische Werte
bool
Bedeutung Datentyp auto
Datentyp wird nach der ersten Zuweisung selbst ausgwertet.
Wie lautet das Schlüsselwort zur Vereinbarung einer symbolischen Konstanten?
Das Schlüsselwort heißt const.
Definition Arithmetik
Die Arithmetik ist ein Teilgebiet der Mathematik, das sich mit Zahlen und den für sie geltenden Rechenregeln befasst.
Definition Arithmetische Operationen
Arithmetische Operationen wie die Addition und die Subtraktion werden durch arithmetische Operatoren gekennzeichnet.
Definition Operator
Ein Operator ist ein Zeichen, das eine bestimmte Operation auslöst – zum Beispiel eben eine Rechenoperation.
Beispiele für arithmetische Operatoren
Zu den arithmetischen Operatoren gehören zum Beispiel das Zeichen + für eine Addition und das Zeichen – für eine Subtraktion.
Definition Priorität
Priorität bei Operatoren bezeichnet in der Programmierung die Rangfolge, nach der Operatoren in einem Ausdruck ausgewertet werden. Operatoren mit höherer Priorität werden vor Operatoren mit niedrigerer Priorität ausgeführt, sofern keine Klammern die Reihenfolge explizit ändern.
Drei Regeln der Priorität bei Operatoren
1. Punktrechnung geht vor Strichrechnung. Die Modulo-Operation zählt dabei wie die Multiplikation und die Division zu den Punktrechnungen. Addition und Subtraktion sind Strichrechnungen.
2. Bei gleicher Priorität werden die Operatoren in der Regel von links nach rechts abgearbeitet. Wenn also Addition und Subtraktion (zwei Strichrechnungen) direkt aufeinander folgen, wird zuerst addiert und dann subtrahiert. Ausnahmen von dieser Regel sind in der vorigen Tabelle aufgeführt.
3. Durch Klammern können Sie die Reihenfolge der Auswertung verändern. Dazu sehen wir uns gleich ein Beispiel an.
Definition Variable
In C++ ist eine Variable ein benannter Speicherbereich, der einen bestimmten Wert eines festgelegten Datentyps aufnehmen kann. Über den Variablennamen kann während der Programmausführung auf diesen Wert zugegriffen, er geändert oder weiterverarbeitet werden. Jede Variable muss vor ihrer Verwendung deklariert werden, wobei Typ und Name angegeben werden.
Bedeutung Interger
positive oder negative ganze Zahl
Wichtiger Faktor Vereinbarung einer Variabel
Die Vereinbarung einer Variablen kann an nahezu beliebiger Stelle im Quelltext erfolgen. Sie müssen lediglich darauf achten, dass Sie die Variable vor dem ersten eigentlichen Gebrauch vereinbaren.
Durch den Compiler vorgegebene Zahlenkonventionen bei Bezeichnern
1. Schlüsselwörter dürfen nicht einzeln als Bezeichner verwendet werden. Bei den Schlüsselwörtern handelt es sich um reservierte Wörter, die vom Compiler selbst verwendet werden – zum Beispiel main oder int. Eine Variable können Sie also nicht int nennen. Sie können allerdings Schlüsselwörter als Teil eines Bezeichners verwenden. Der Bezeichner intVar wäre dann zum Beispiel erlaubt.
2. Das erste Zeichen eines Bezeichners muss entweder ein Unterstrich _ oder ein Buchstabe sein. Alle anderen Zeichen und auch Zahlen sind als erstes Zeichen nicht erlaubt und führen zu einer Fehlermeldung des Compilers.
3. Die weiteren Zeichen des Namens müssen Buchstaben, Zahlen oder Unterstriche sein. Die deutschen Umlaute sowie das ß dürfen Sie dabei aber nicht verwenden. Zeichen wie . oder / dürfen Sie in einem Bezeichner ebenfalls nicht verwenden.
4. C++ unterscheidet bei den Bezeichnern zwischen Groß- und Kleinschreibung. Die Bezeichner Zahl und zahl stehen also für zwei unterschiedliche Datenobjekte
Richtlinien für Bezeichner durch Stilmittel
1. Verwenden Sie sprechende Bezeichner, die bereits erste Hinweise auf den Zweck der Variablen geben. So sind Namen wie a, b oder c nicht sonderlich geeignet, weil sie keinen Hinweis auf den Zweck der Variablen geben. Besser wären zum Beispiel summe, rest oder ergebnis.
2. Wählen Sie kurze prägnante Namen. Zwar ist die Länge der Bezeichner in C++ nicht beschränkt, aber lange komplizierte Namen führen schnell zu Fehlern und machen den Quelltext auch schwer lesbar. Denken Sie daran: Sie müssen immer den vollständigen Namen der Variablen eingeben, wenn Sie mit der Variablen arbeiten wollen. Zu kurz sollten Sie den Namen aber auch nicht wählen, da er andernfalls nicht mehr verständlich ist.
3. Wenn Sie zusammengesetzte Namen verwenden, beginnen Sie jeden Bestandteil des Namens mit einem Großbuchstaben. So lässt sich ergebnisAddition sehr viel leichter lesen als ergebnisaddition oder auch ergebnis_addition. Der erste Buchstabe eines Bezeichners sollte grundsätzlich klein geschrieben werden.
Definition Inkrementoperator
Erhöht den einggebenen Wert um 1
Definition Dekrementoperator
Verringert die eingegebene Zahl um 1
Zeichen Inkrementoperatoren
++
Zeichen Dekrement operatoren
--
Definiton sympbolische Konstanten
Neben den Variablen können Sie in einem C++-Programm auch symbolische Konstanten verwenden. Diese Konstanten erhalten einmal einen festen Wert, der danach nicht mehr verändert werden kann.
Indikation für den Einsatz von symbolischen Konstanten
Symbolische Konstanten sollten Sie immer dann verwenden, wenn Sie in Ihrem Programm mehrfach einen unveränderlichen Wert verwenden – zum Beispiel einen Schlüssel für die Berechnung der Mehrwertsteuer oder mathematische Werte wie die Zahl π (Pi). Da der Wert der Konstanten einmal festgelegt wird, können Sie – wenn erforderlich – später genau an dieser einen Stelle den Wert verändern – zum Beispiel bei Erhöhungen der Mehrwertsteuer.
Wie wird der Operator bei einer Zuweisung genannt, mit dem Sie einer Variablen einen Wert zuweisen? Wie wird dieser Operator geschrieben?
Der Operator heißt Zuweisungsoperator und wird mit dem Zeichen = dargestellt.
Funktion using namespace std;
vereinbart einen Namensraum – Hier std
Befehl cout
t steht für console output (übersetzt etwa: „Konsolenausgabe“).
Befehl std
steht als Abkürzung für Standard
Befehl für einen Zeilenumbruch
/n
Begrenzung von Zeichenketten
Zeichenketten werden mit Anführungszeichen eingeschlossen.
Darstellung einzelne Zeichen
Einzelne Zeichen werden mit Apostrophen eingeschlossen.
Definition Escape-Rückzeichen
Escape-Sequenzen sind spezielle Steuerzeichen. Sie werden durch den Backslash \ eingeleitet
Formen der Escape-Sequenzen
\t
\b
\r
\a
Bedeutung Escapezeichen \t
Die Einfügemarke wird an den nächsten horizontalen Tabulator gesetzt. Sie bewegt sich damit nach rechts
Bedeutung Escapesequenz \b
Die Einfügemarke wird ein Zeichen nach links bewegt.
Bedeutung Escape-Sequenz \r
Die Einfügemarke wird nur an den Beginn der aktuellen Zeile gesetzt. Es erfolgt kein Zeilenumbruch.
Bedeutung Escape-Sequenz \a
Es wird ein Signalton ausgegeben
Art, wie der Anweisungsteil abgegrenzt ist
Mit zwei geschweiften Klammern
Funktion Das Kommentarzeichen //
Alles, was in der Zeile rechts von dem Kommentarzeichen steht, wird vom Compiler als Kommentar betrachtet und ignoriert. Das Kommentarzeichen // wird häufig eingesetzt, um einzelne Anweisungen zu kommentieren oder um einzelne Anweisungen zur Fehlersuche in einem Programm abzuschalten. Man spricht in diesem Fall auch von „auskommentieren“.
Funktion Kommentarzeichen Die Kommentarzeichen /* und */
Mit den Kommentarzeichen /* und */ können Sie ganze Blöcke im Quelltext als Kommentar markieren. Die Zeichen /* markieren dabei den Beginn eines Kommentars und die Zeichen */ das Ende des Kommentars. Alles, was zwischen diesen Zeichen steht, wird vom Compiler als Kommentar betrachtet. Diese Methode wird benutzt, um größere Kommentare zu erstellen oder bei der Fehlersuche in Programmen große Blöcke abzuschalten.
Welche Funktion muss in jedem C++-Konsolenprogramm enthalten sein? Warum?
In jedem C++-Konsolenprogramm muss die Funktion main() enthalten sein. Sie bildet den Startpunkt für die Ausführung des Programms.
Mit welchen Zeichen wird der Anweisungsteil einer Funktion eingeschlossen? Mit welchem Zeichen werden einzelnen Anweisungen im Anweisungsteil voneinander getrennt?
Der Anweisungsteil muss durch { und } umfasst werden. Die einzelnen Anweisungen werden durch ; getrennt.
Wie können Sie Kommentare in ein C++-Programm einfügen? Nennen Sie bitte beide Möglichkeiten.
Es gibt zwei Möglichkeiten: // um einen Kommentar in einer Zeile einzufügen und /* */ um einen Kommentarblock einzufügen.
Bedeutung Syntax im Quelltext
Die Syntax bezeichnet die Regeln, die durch die Programmiersprache vorgegeben werden.
Bedeutung Semantik im Quelltext
Die Semantik dagegen bezeichnet die Bedeutung eines Textes – bei einem Quelltext also das, was das Programm ausführen soll: die Funktionalität.
Formen von Meldungen im QT Creator
• Hinweise
• Warnungen
• Fehler.
Definition Hinweise im QT Creator
Hinweise sind nicht kritisch. Hier finden Sie vor allem zusätzliche Informationen. Das Programm wird trotz der Hinweismeldungen übersetzt und auch ausgeführt.
Definition Warnungen im QT Creator
Warnungen weisen Sie auf Stellen hin, die möglicherweise zu Schwierigkeiten führen können. Eine Warnung kann zum Beispiel erscheinen, wenn Sie etwas im Quelltext vereinbaren, aber nie benutzen. Genau wie bei den Hinweisen führen auch Warnungen nicht zum Abbruch der Übersetzung.
Definition Fehler im QT Creator
Die dritte Kategorie schließlich sind die Fehler. Wenn Sie beim Schreiben eines Programms zum Beispiel ein Zeichen in einem Befehl vergessen oder eine Anweisung verwenden, die der Compiler nicht kennt, wird die Übersetzung abgebrochen. Schauen wir uns jetzt genauer an, wie der Qt Creator Fehler meldet und wie Sie diese Fehler beheben. Dazu verwenden wir den Quelltext, der automatisch für ein neues C++- Projekt anlegt wird.
Was ist ein Konsolenprogramm?
Ein Konsolenprogramm ist ein Programm, das in der Eingabeaufforderung oder einem Terminal ausgeführt wird.
Wie erstellen Sie ein neues Projekt für ein Konsolenprogramm? Nennen Sie die nötigen Befehle und Auswahlen.
Ein neues Projekt für ein Konsolenprogramm starten Sie über Datei/Neu… Im ersten Schritt wählen Sie im linken Listenfeld den Eintrag Projekt ohne Qt im Bereich Projekte, und klicken Sie danach im mittleren Listenfeld auf den Eintrag Reine C++-Anwendung. Klicken Sie dann auf die Schaltfläche Auswählen… unten rechts im Fenster. Im folgenden Fenster geben Sie einen Namen für das Projekt ein und wählen einen Ordner aus. Die weiteren Einstellungen können Sie in der Regel unverändert übernehmen.
Wie werden Zeichenketten zwischen Anführungszeichen in der Standardeinstellung im Editor dargestellt?
Zeichenketten zwischen Anführungszeichen werden in der Standardeinstellung in grüner Schrift angezeigt
Im Quelltext wird einer Zeile mit einer roten Linie markiert. Wofür steht diese Markierung?
Eine rote Linie markiert einen Fehler im Quelltext.
Definition ANSI
ANSI (American National Standards Institute) ist eine amerikanische Gruppe von Ausschüssen zur Standardisierung in unterschiedlichsten Bereichen. Für den Bereich Computer, Datenverarbeitung und Informationstechnologie ist der Ausschuss ANSI-X3 zuständig (früher auch als USASI – United States of America Standards Institute bekannt). Eine ANSI-Norm ist vergleichbar mit einer DINVorschrift.
Definition Assembler
Ein Assembler ist eine Programmiersprache, die auf einer sehr niedrigen Ebene arbeitet. Die Programmierung erfolgt über Mnemonics.
Definition Binäres System
Ein binäres System ist ein System, das genau zwei Zustände abbilden kann.
Definition C
Die Programmiersprache C ist ein wichtiger Vorläufer der Programmiersprache C++.
Definition Compiler
Ein Compiler setzt einen Quelltext in ein ausführbares Programm um. Die gesamte Übersetzung erfolgt vor der Ausführung.
Definition Editor
Ein Editor ist ein Programm zum Erfassen und Bearbeiten von Informationen.
Definition Gigabyte
Ein Gigabyte entspricht 1024 Megabytes. Häufig wird auf 1000 Megabytes gerundet.
Definition Hochsprache
Eine Hochsprache ist eine Programmiersprache, die sich zum Teil eng an der menschlichen Sprache orientiert. Viele Hochsprachen unterstützen auch Konstruktionen wie Schleifen und die objektorientierte Programmierung.
Abkürzung IDE
IDE ist die Abkürzung für Integrated Development Environment.
Definition IDE
ntegrated Development Environment ist der englische Begriff für Integrierte Entwicklungsumgebung.
Definition Integrierte Entwicklungsumgebung
Eine integrierte Entwicklungsumgebung fasst mehrere Werkzeuge zur Programmierung unter einer Oberfläche zusammen – zum Beispiel den Editor, den Compiler und den Linker.
Definition Interpreter
Ein Interpreter setzt einen Quelltext in ein ausführbares Programm um. Die Umsetzung erfolgt zur Laufzeit des Programms.
Definition ISO
ISO (International Organization for Standardization) ist eine internationale Organisation, die international gültige Standards aufstellt. Zu den Mitgliedern der ISO gehören zum Beispiel ANSI und das Deutsche Institut für Normung DIN.
Definition Kilobyte
Ein Kilobyte entspricht 1024 Bytes. Häufig wird auf 1000 Bytes gerundet.
Definition Linker
Ein Linker fasst mehrere Dateien zu einer einzigen Datei zusammen
Definition main()
main() ist die Hauptfunktion eines C++-Programms.
Definition Megabyte
Ein Megabyte entspricht 1024 Kilobytes. Häufig wird auf 1000 Kilobytes gerundet.
Defintion Mnemonic
Ein Mnemonic ist ein Befehl eines Assemblers – zum Beispiel MOV.
Definition objektorientierte Programmierung
Bei der objektorientierten Programmierung werden Daten- und Verhaltensaspekte gemeinsam betrachtet. Das wesentliche Element der objektorientierten Programmierung ist das Objekt.
Definition Projekt
Ein Projekt in Qt Creator fasst alle Elemente einer Anwendung zusammen. Es gibt verschiedene Arten von Projekten – zum Beispiel Projekte für Konsolenprogramme und Projekte für Qt-Widgets-Anwendungen. Normalerweise besteht ein Projekt aus zahlreichen einzelnen Dateien. Die Projektdatei selbst trägt die Erweiterung .pro.
Definition QT Designer
Der Qt Designer ist ein Werkzeug zum schnellen Erstellen von grafischen Oberflächen.
Definition QT-Klassenbibliothek
Die Qt-Klassenbibliothek ist eine Sammlung mit vorgefertigten Klassen für die unterschiedlichsten Einsatzgebiete. Sie enthält mehrere hundert verschiedene Klassen.
Definition Quelltext
Der Quelltext sind die Anweisungen eines Programms, so wie sie im Editor eingegeben werden.
Definition Reservierte Wörter
Reservierte Wörter sind Zeichenketten, die intern vom Compiler verwendet werden. Solche Zeichenketten dürfen Sie nicht selbst benutzen. Reservierte Wörter sind zum Beispiel main oder void.
Definition Zeichenkette
Eine Zeichenkette ist eine beliebige Folge von Zeichen – zum Beispiel ein Wort.
Definition IDE (Integrated Development Enviroment)
Entwicklungswerkzeuge, die mehrere unterschiedliche Programme unter einer Oberfläche zusammenfassen, werden auch integrierte Entwicklungsumgebung oder IDE genannt. Die Abkürzung IDE leitet sich von der englischen Bezeichnung Integrated Development Environment ab.
Integrated Development Environment
Nennen Sie mindestens vier wichtige Programme, die der Qt Creator anbietet.
Der Qt Creator ist eine integrierte Entwicklungsumgebung (IDE), die speziell für die plattformübergreifende Entwicklung mit dem Qt-Framework entwickelt wurde. Hier sind vier wichtige Programme bzw. Funktionen, die Qt Creator anbietet:
Code-Editor Qt Creator bietet einen leistungsstarken Editor mit Syntaxhervorhebung, Codevervollständigung, Refactoring-Tools und Unterstützung für mehrere Programmiersprachen wie C++, QML und JavaScript.
Formular-Designer (Qt Designer) Mit diesem visuellen Tool können Benutzer grafische Benutzeroberflächen (GUIs) per Drag-and-Drop erstellen, ohne manuell C++-Code für das Layout schreiben zu müssen.
Debugger Integrierter Debugger für C++ und QML, der das Setzen von Breakpoints, Überwachen von Variablen und Schritt-für-Schritt-Ausführen von Code ermöglicht – mit Unterstützung für GDB und LLDB.
Projekt- und Build-Management Qt Creator unterstützt verschiedene Build-Systeme wie qmake, CMake und sogar externe Tools. Es verwaltet Projekte effizient und erleichtert das Kompilieren, Verlinken und Deployen.
Mit welcher Funktion können Sie im Index der Hilfedokumente von Qt Creator suchen?
Sie öffnen das Hilfe-Fenster und können dort über die Registerkarte „Index“ gezielt nach Stichwörtern suchen.
Alternativ nutzen Sie das Suchfeld oben rechts im Hilfe-Fenster, um eine Volltextsuche durchzuführen.
Strg + Umschalt + H (öffnet das Hilfe-Modul direkt)
F1 (zeigt kontextsensitive Hilfe zur aktuellen Auswahl oder Funktion)
Nennen Sie zwei Möglichkeiten, die Hilfe zu Qt Creator anzuzeigen
Hier sind zwei Möglichkeiten, wie Sie die Hilfe zu Qt Creator anzeigen können:
✅ Kontextsensitive Hilfe mit F1
Wenn Sie den Cursor auf ein Qt-Schlüsselwort (z. B. QPushButton) setzen und F1 drücken, öffnet sich die passende Dokumentation im Hilfe-Fenster.
Diese Methode zeigt gezielt Hilfe zur aktuell markierten Klasse oder Funktion.
✅ Hilfe-Fenster über das Menü öffnen
Gehen Sie zu „Help“ → „Contents“ oder „Help“ → „Index“ im Hauptmenü.
Dadurch öffnet sich das Hilfe-Modul, in dem Sie die komplette Qt-Dokumentation durchsuchen können (Inhalt, Index, Suche).
Was ist Qt im Allgemeinen?
Qt ist ein Framework, das zahlreiche fertige Objekte für die Entwicklung von Programmen, insbesondere grafischer Oberflächen, bereitstellt.
: Welche grafischen Elemente stellt Qt zur Verfügung?
Qt bietet u.a. Schaltflächen, Eingabefelder und Dialogfenster als Steuerelemente für grafische Oberflächen.
Was ist der Qt Creator?
Qt Creator ist eine integrierte Entwicklungsumgebung (IDE), die verschiedene Programme für die Entwicklung von C++-Programmen unter einer Oberfläche vereint.
Welche Komponenten enthält der Qt Creator?
Texteditor zum Schreiben von Quellcode
Compiler zum Übersetzen des Codes
Linker zum Zusammenfügen von Dateien
GUI-Designer
Weitere Hilfsprogramme
Welche Betriebssysteme unterstützt Qt?
Qt ist plattformübergreifend und unterstützt verschiedene Betriebssysteme sowie verschiedene Compiler und GUI-Werkzeuge.
Welche Werkzeuge werden im Lehrgang verwendet?
t Creator zur GUI-Erstellung und MinGW als Übersetzungswerkzeug.
Was ist eine IDE?
Eine integrierte Entwicklungsumgebung (IDE) ist ein Softwarepaket, das verschiedene Entwicklungswerkzeuge unter einer Oberfläche vereint.
Welche Lizenzmodelle bietet Qt?
Open-Source-Lizenz für privaten Einsatz
Kommerzielle Lizenz für gewerblichen Einsatz
: Wo findet man weitere Informationen zu Qt und den Lizenzmodellen?
: Auf der offiziellen Webseite: https://www.qt.io
Warum ist die direkte Programmierung in Einsen und Nullen problematisch?
Weil sie sehr zeitaufwendig und fehleranfällig ist, da kein direkt nachvollziehbarer Zusammenhang zwischen Aktion und Code besteht.
Was ist ein Assembler und welche Vorteile bietet er?
Ein Assembler erlaubt die Programmierung mit Mnemonics statt Binärcode, was das Schreiben von Programmen verständlicher macht.
Was ist ein Nachteil von Assembler-Programmen?
Sie müssen vor der Ausführung in Maschinensprache übersetzt werden.
Nenne Beispiele für höhere Programmiersprachen.
asic, Pascal, C, C++, COBOL.
Welche zusätzlichen Strukturen bieten höhere Programmiersprachen?
Schleifen, Funktionen, Objekte usw.
Was ist ein Compiler?
Ein Programm, das den Quelltext vollständig in Maschinensprache übersetzt, bevor das Programm ausgeführt wird.
Was ist ein Linker?
Ein Programm, das mehrere Dateien zu einem ausführbaren Programm zusammenfügt.
Was ist ein Interpreter?
Ein Programm, das Quelltext Anweisung für Anweisung während der Laufzeit ausführt.
Welche Sprachen arbeiten typischerweise mit einem Interpreter?
: Ältere BASIC-Versionen und JavaScript.
Wer entwickelte C++ und wann?
Bjarne Stroustrup, 1980 bei den AT&T Bell Laboratories.
Wie hieß C++ ursprünglich?
C mit Klassen
Wann wurde der Name „C++“ eingeführt?
1983
Wann erschien das Buch „The C++ Programming Language“?
1986
Warum war die Standardisierung von C++ notwendig?
Weil es viele inkompatible Dialekte gab, die nicht mit jedem Compiler funktionierten.
Welche Organisation begann 1990 mit der Standardisierung von C++?
ANSI (American National Standards Institute).
Wann wurde der ISO C++-Standard erstmals veröffentlicht?
1998
Was ist der Zweck des ISO-Standards für C++?
: Sicherzustellen, dass C++-Programme mit verschiedenen Compilern übersetzt werden können.
Was bedeutet „Compiler“ wörtlich übersetzt?
Zusammentragen
Was bedeutet „Linker“ wörtlich übersetzt?
Verbinder
Welche Programmiersprache war der wichtigste Vorläufer von C++?
C
: Was erweitert C++ im Vergleich zu C?
Klassen und objektorientierte Programmierung.
Welche Organisationen sind an der Standardisierung von C++ beteiligt?
ANSI (USA) und ISO (international).
Last changed2 days ago