CoboCards App FAQ & Wishes Feedback
Language: English Language
Sign up for free  Login

Get these flashcards, study & pass exams. For free! Even on iPhone/Android!

Enter your e-mail address and import flashcard set for free.  
Go!
All main topics / Wirtschaftsinformatik / Grundlagen der Softwareentwicklung

Objektorientierte und generische Programmierung (134 Cards)

Say thanks
1
Cardlink
0
Weshalb sollte Quellcode dokumentiert werden?
- erleichtert Verständnis des Quellcodes
- Implementierungsentscheidungen begründen und nachvollziehbar
   machen
- bessere Wartbarkeit
Tags: Hilfswerkzeuge
Source:
2
Cardlink
0
Was sind die Vorteile der automatischen Dokumentation?
- Konsistenz von Dokumentation und Quelltext
- automatische Formatierung und Erzeugung von Querverweisen
- einheitliche Formatierung
- Integration von Build- Systemen
Tags: Hilfswerkzeuge
Source:
3
Cardlink
0
Was ist ein Profiler?
- Programm zur Bestimmung der Performanz eines anderen
   Programms
- zur Laufzeit werden Informationen über das andere Programm
   gesammelt und ausgewertet
          - Aufrufhäufigkeit von Programmteilen (Funktionen)
          - Ausführungszeit von Programmteilen
Tags: Hilfswerkzeuge
Source:
4
Cardlink
0
Welche Methoden des Profilings gibt es?
Sampling
- statistischer Ansatz
- Programm wird in bestimmten Abständen untersucht und die
  aktuelle Position der Ausführung festgehalten

Instrumentierung
- in das untersuchte Programm werden zusätzliche Anweisungen
  eingefügt um benötigte Informationen zu bekommen
- genauere Ergebnisse, aber zusätzliche Anweisungen können
   Performanz beeinflussen und so das Ergebnis verfälschen
Tags: Hilfswerkzeuge
Source:
5
Cardlink
0
Was sind die grundlegenden Aufgaben von Build- Tools?
- vollständige Erstellung einer Anwendung oder ihrer Module
→ nur eine Neu- Erstellung der geänderten Bestandteile und ihrer
     Abhängigkeiten notwendig um komplette Anwendung zu
     erzeugen
Tags: Hilfswerkzeuge
Source:
6
Cardlink
0
Wie sieht der Syntax für make aus?
polymorphie: main.o typ_konstruktor.o
          g++ -o main.out main.o typ_konstruktor.o

main.o: typ_konstruktor.o main.cpp
          g++ -c main.cpp

typ_konstruktor.o: typ_konstruktor.h typ_konstruktor.cpp
          g++ -c typ_konstruktor.cpp


- vor der Anweisung (g++ … ) muss ein Tab sein!
Tags: Hilfswerkzeuge
Source:
7
Cardlink
0
Was ist ein Scheinziel?
- im makeflile kann das Scheinziel PHONY definiert werden,
  welches nur virtuell existiert und keine wirkliche Zieldatei darstellt
- make erkennt das Scheinziel immer als "updatewürdig" und führt  
  die zugehörige Abhängigkeit immer aus
- nicht dazu da, um Kompilierung zu erzwingen

PHONY: clean           #Eine Abhängigkeit zu „clean“ wird hergestellt
clean:                          #clean basiert auf einem Scheinziel und wird
rm *.obj                       #daher immer ausgeführt
Tags: Hilfswerkzeuge
Source:
8
Cardlink
0
Was sind Testzwecke?
- frühzeitiges Erkennen von Fehlern vermeidet Kosten
- Aufdecken von Sicherheitsproblemen
- Sicherstellen, dass einzelne Komponenten auch zusammen im
   Gesamtsystem funktionieren
- Sicherung der Softwarequalität
→ gemeinsame Formulierung der Testfälle durch Auftraggeber und
     Entwickler stellt sicher, dass beide die Anforderungen gleich 
     verstanden haben
Tags: Hilfswerkzeuge
Source:
9
Cardlink
0
Was ist ein Testling?
- die Softwarekomponente, welche getestet wird
= Prüfling
= Testobjekt
Tags: Hilfswerkzeuge
Source:
10
Cardlink
0
Was ist ein Testfall?
- Satz von Testdaten, der die vollständige Ausführung des
   Testlings bewirkt
Tags: Hilfswerkzeuge
Source:
11
Cardlink
0
Was ist die Testabdeckung?
- Maß für den Grad der Vollständigkeit eines Tests
Tags: Hilfswerkzeuge
Source:
12
Cardlink
0
Was ist Regression?
- Wiederauftreten von schon behobenen Fehlern
Tags: Hilfswerkzeuge
Source:
13
Cardlink
0
Was ist Test Driven Development (TDD)?
- Test wird vor der eigentlichen Implementierung geschrieben
→ dieser stellt sicher, dass die Anforderungen genau bekannt sind
     und die Komponente so entworfen wird, dass sie testbar ist
- Entwicklungsprozess verläuft inkrementell
→ Quelltextqualität nimmt ständig ab
→ Refactoring notwendig
- Verwendung von Unit- Tests
- Grey- Box- Test
          - Nur die Anforderungen an die Komponente sind bekannt
          - Test nimmt Einfluss auf die Entwicklung der Komponente
Tags: Hilfswerkzeuge
Source:
14
Cardlink
0
Was sind Komponententests?
= Unit- Tests
- zeitnah zur Programmierung erstellt und nach jeder Modifikation
   ausgeführt
- kleine Programmteile werden isoliert von anderen getestet
- Granularität reicht von einer Methode bis zu einer einzelnen
   Komponente
- White- Box- Tests
Tags: Hilfswerkzeuge
Source:
15
Cardlink
0
Wie kommunizieren Objekte?
- durch Nachrichten
- beim Empfang einer Nachricht
          - prüft das Objekt, ob es die Nachricht kennt
          - und führt die entsprechende Methode aus
Tags: Objektorientierung
Source:
16
Cardlink
0
Was ist Verkapselung?
- Daten und Funktionen bilden eine Einheit
- Geheimnisprinzip
          - Daten sind verborgen
          - Zugriff auf Daten nur über Funktionen
Tags: Objektorientierung
Source:
17
Cardlink
0
Welche Arten der Polymorphie gibt es?
Universelle Polymorphie
= gleicher Code für unterschiedliche Typen
- parametrische Polymorphie
- Inklusionspolymorphie

Ad Hoc Polymorphie
= unterschiedlicher Code für unterschiedliche Typen
- Überladungspolymorphie
- Typumwandlungspolymorphie mittels
          - Konstruktor
          - Operator
Tags: Objektorientierung
Source:
18
Cardlink
0
Was ist ein Typumwandlungskonstruktor?
= jeder Konstruktor, welcher mit nur einem Argument aufgerufen
   werden kann
→ um zu verhindern, dass ein Konstruktor implizit zwecks
   Typumwandlung aufgerufen werden kann, wird ihm das
   Schlüsselwort explicit vorangestellt
Tags: Objektorientierung
Source:
19
Cardlink
0
Wie lautet das Liskovsche Typ- Substituierbarkeitsprinzip?
Bei einer öffentlichen Vererbungsbeziehung kann an die Stelle eines Exemplars der Basisklasse jederzeit ein Exemplar einer abgeleiteten Klasse treten

- nur bei public- Vererbung, nicht bei protected- oder
  private- Vererbung
- nur die Bestandteile der Basisklasse sind zugreifbar
- Implementierung der Memberfunktion der Basisklasse wird  
   aufgerufen
→ frühe Bindung, da zur Übersetzungszeit festliegt, welche
     Memberfunktion aufgerufen wird
- strenge Formalisierung der Subtyp- Beziehung
- "Ist- ein- Vererbung"
Tags: Objektorientierung
Source:
20
Cardlink
0
Was ist späte Bindung?
= dynamische Bindung
- beim Aufruf einer Memberfunktion wird die Implementierung der
   überschreibenden Methode in der abgeleiteten Klasse  
   ausgeführt
→ Typ des Objektes wird zur Laufzeit bestimmt
→ Inklusionspolymorphie
Tags: Objektorientierung
Source:
21
Cardlink
0
Wie wird späte Bindung erreicht?
- Funktion muss in der Basisklasse als virtual deklariert werden
- erneute Deklarierung als virtual in den abgeleiteten Klassen
  nicht erforderlich
→ einmal virtuell, immer virtuell
- Übergabe der betreffenden Exemplare als Referenz oder als
   Zeiger zwingend erforderlich
          - bei der Übergabe als Wert kann kein virtueller
             Funktionsauruf durchgeführt werden
          - Kopieren des (aktuellen) Parameters bewirkt, dass ein
             neues temporäres Exemplar vom Typ des formalen
             Parameters erzeugt wird
Tags: Objektorientierung
Source:
22
Cardlink
0
Was sind rein virtuelle Funktionen?
- Methode wird bei ihrer Deklaration virtual voran- und =0
   nachgestellt
- kann eine Implementierung in der Basisklasse besitzen, muss
   aber nicht
- besitzt sie eine Implementierung, muss die Definition außerhalb
   der Klasse erfolgen
Tags: Objektorientierung
Source:
23
Cardlink
0
Was ist eine abstrakte Klasse?
= eine Klasse, welche mindestens eine rein virtuelle Funktion besitzt
- von ihr können keine Exemplare angelegt werden
- erbt eine Klasse von einer abstrakten Klasse, müssen in ihr alle
  rein virtuellen Funktionen überschrieben werden, damit sie nicht
  länger abstrakt ist
- besitzt eine Klasse ausschließlich rein- virtuelle Memberfunktionen
  entspricht sie konzeptional einer Schnittstelle (interface) in Java
Tags: Objektorientierung
Source:
24
Cardlink
0
Was ist kovariante Spezialisierung?
- beim Überschreiben virtueller Funktionen darf der Rückgabetyp
  nicht verändert werden
- kovariante Spezialisierung des Rückgabetyps im Falle der
  Verwendung von Zeigern oder Referenzen als Rückgabetyp ist
  jedoch zulässig

Quellcode
Tags: Objektorientierung
Source:
25
Cardlink
0
Was ist vtbl?
= virtual function table
= ein Feld mit Funktionszeigern
- jede Klasse, die über eigene oder geerbte virtuelle
  Funktionen verfügt, besitzt eine eigene virtual function table
- jedes Exemplar einer Klasse hat einen Zeiger auf die vtbl seiner
  Klasse
- ein virtueller Funktionsaufruf erfolgt über den Zeiger auf die vtbl
  und von dort über den Index eines Elementes der vtbl
Tags: Objektorientierung
Source:
26
Cardlink
0
Wie sind die Spielregeln der Vererbung?
- in abgeleiteten Klassen können Attribute und Methoden
  hinzukommen
- geerbte Attribute und Methoden können nicht wegfallen
- wird eine Methode oder ein Attribut in einer Unterklasse erneut
  deklariert, verdeckt es das gleichnamige Mitglied der Basisklasse
Tags: Objektorientierung
Source:
27
Cardlink
0
Was ist Delegation?
= Mechanismus, der die Verantwortung zum Ausführen einer
   Methode oder zum Auffinden eines Attributes an ein oder
   mehrere andere Objekte weitergibt
- dient dem Wiederverwenden und Teilen von Ressourcen
- kann zwischen Objekten stattfinden
     → kein Sprachmittel dafür in C++ vorhanden
- kann zwischen Klassen stattfinden
     → Vererbung
Tags: Objektorientierung
Source:
28
Cardlink
0
Was ist die strenge Vererbung?
= "ist- ein- Vererbung"
- eine abgeleitete Klasse muss vollständig kompatibel zu ihrer
   Basisklasse sein
→ Liskovsches Typsubstituierbarkeitsprinzip
- Typhierarchie und Klassenhierarchie fallen zusammen

Beispiel
Ableitung der Klasse Hai von der Klasse Fisch
Tags: Objektorientierung
Source:
29
Cardlink
0
Was ist eine Ähnlichkeitsbeziehung?
- eine abgeleitete Klasse "ähnelt" ihrer Basisklasse
- Exemplar der abgeleiteten Klasse muss nicht grundsätzlich an die
   Stelle eines Exemplars der Basisklasse treten können

Beispiel
Ableitung der Klasse Wal von der Klasse Fisch
Tags: Objektorientierung
Source:
30
Cardlink
0
Was ist Implementierungsvererbung?
- Vererbung zwecks Teilen gemeinsamer Implementierungsanteile
→"code sharing"
- es werden Attribute und Methoden einschließlich ihrer
   Implementierung vererbt
- vor allem private- und protected- Vererbung
Tags: Objektorientierung
Source:
31
Cardlink
0
Was ist Schnittstellenvererbung?
- vererbt werden nur Spezifikationen von Schnittstellen, aber keine
   Implementierungen
- Nachbildung in C++ durch
          - public- Vererbung
          - abstrakte Klassen, die keine Memberattribute, sondern nur
             rein- virtuelle Funktionen besitzen
- entspricht interface (= Definition von Schnittstellen) und
   implements (= eine Klasse implementiert Schnittstelle) in Java
Tags: Objektorientierung
Source:
32
Cardlink
0
Welche Operatoren können nicht überladen werden?
sizeof Ermiteln der Größe von Typen und Objekten
. Zugriffsoperator für Member
.* Zugriffsoperator für Elementzeiger
:: Bereichsoperator
? : Auswahloperator
Tags: Operatoren
Source:
33
Cardlink
0
Wie werden Operatoren überladen?
- ein Operator wird mit dem Schlüsselwort operator gefolgt von
  dem Namen des Operators ⊗ definiert

innerhalb einer Klasse
rückgabetyp typ1::operator ⊗ (typ2 par2, … ) { … }

- das erste Argument, also der erste Parameter eines als
   Memberfunktion definierten Operators ist immer das aktuelle
   Element der Klasse *this

als freie Funktion
rückgabetyp operator ⊗ (typ1 par1, typ2 par2, … ) { … }
Tags: Operatoren
Source:
34
Cardlink
0
Wie werden Ein- und Ausgabeoperatoren überladen?
- können für benutzerdefinierte Datentypen überladen werden
- links vom E/A- Operator steht immer die Stromvariable
- rechts vom E/A- Operator steht die einzulesende Variable / der
  auszugebende Ausdruck
→ müssen als freie Funktion überladen werden

Quellcode
Tags: Operatoren
Source:
35
Cardlink
0
Was ist OKF?
= orthodoxe kanonische Klassenform (OKF)
- besitzt ein Objekt dynamische Anteile, benötigt es:
          - einen Standardkonstruktor, damit Felder mit Elementen
             von der Klasse angelegt werden können
          - einen Kopierkonstruktor, der dynamische Anteile beschafft
             und sie korrekt kopiert
          - einen Zuweisungsoperator, der eine Selbstzuweisung
             verhindert, alte dynamische Anteile freigibt, neue beschafft
             und korrekt zuweist
          - einen Destruktor, der dynamische Anteile freigibt
          - einen virtuellen Destruktor, wenn die Klasse als
            Basisklasse geeignet sein soll
Tags: Objektorientierung
Source:
36
Cardlink
0
Wie funktioniert die Speicherbeschaffung für dynamische Anteile?
- handelt es sich um dynamischen Speicher, wird der
   entsprechende Zeiger in der Initialisierliste mit NULL initialisiert
- der nötige Speicher wird im Konstruktor mit new oder new[]
   beschafft
          - bei Fehlschlag hat der Zeiger den Wert NULL
          → NULL- Zeiger darf beliebig oft freigegeben werden
          → dynamischen Speicher nie in der Initialisierliste
                beschaffen, da bei einem Fehlschlag der Zeiger einen Wert
                ungleich NULL hätte

Quellcode
Tags: Objektorientierung
Source:
37
Cardlink
0
Wie funktioniert der Kopierkonstruktor nach OKF?
= erzeugt eine Kopie anhand einer Vorlage
→ es existieren 2 unterschiedliche Exemplare, welche sich
     unterschiedlich entwickeln können
→ dynamische Anteile dürfen nicht gemeinsam genutzt werden
          - dynamische Anteile müssen ebenfalls kopiert werden
           = deep copy

Quellcode
Tags: Objektorientierung
Source:
38
Cardlink
0
Wie funktioniert der Zuweisungsoperator nach OKF?
(1) bei einer Selbstzuweisung dürfen Freigabe, Neubeschaffung und
      Kopieren der dynamischen Anteile nicht erfolgen und es wird nur
      eine Referenz auf das Objekt selbst zurückgegeben
(2) das Objekt, dem ein neues Objekt zugewiesen wird muss
       zunächst seine dynamischen Anteile freigeben
(3) dann werden manuell alle nicht- dynamischen Anteile zugewiesen
(4) dynamischen Anteile werden neu beschafft …
(5) … und manuell zugewiesen

Quellcode
Tags: Objektorientierung
Source:
39
Cardlink
0
Was ist der dynamische und statische Typ eines Objektes?
Dynamischer Typ
- tatsächlicher Typ eines Objekts

Statischer Typ
- Typ einer Referenz oder eines Zeigers auf ein Objekt
- kann allgemeiner (= weniger speziell) oder gleich dem
   dynamischen Typ eines Objekts sein
Tags: Operatoren
Source:
40
Cardlink
0
Was ist für den Zuweisungsoperator in Verbindung mit Vererbung zu beachten?
- Zuweisung mit später Bindung muss als Memberfunktion der
  Basisklasse implementiert und in allen abgeleiteten Klassen
  überschrieben werden
- ein Zuweisungsoperator, wie ihn der Compiler erzeugen würde,
  muss in jeder Klasse überladen werden und die spät gebundene
  Zuweisungsfunktion aufrufen
- für Objekte mit dynamischen Ressourcen muss die
  Selbstzuweisung verhindert werden
- funktioniert nicht bei Mehrfachvererbung

→ syntaktisch unzulässige Zuweisungen sind nicht möglich, auch
     wenn der dynamische Typ dies im Prinzip erlauben würde
Tags: Operatoren
Source:
41
Cardlink
0
Wann ist eine Zuweisung sinnvoll und zulässig?
=   STo ⊇ STo   STo ⊂ STo
DTo ⊇ DTo sinnvoll & zulässig sinnvoll & unzulässig
DTo ⊂ DTo unsinnig & zulässig¹ unsinnig & unzulässig


¹ … wird nicht vom Compiler, sondern erst zur Laufzeit entdeckt
DT … Dynamischer Typ
ST … Statischer Typ
o … Operand 1
o … Operand 2
a ⊇  b … a ist eine Obermenge von b
a ⊂ b … a ist eine echte Teilmenge von b
Tags: Operatoren
Source:
42
Cardlink
0
Was ist eine virtuelle Basisklasse?
= jeder ihrer direkten Nachkommen ist virtuell abgeleitet (virtual)
- Subobjekt einer virtuellen Basisklasse kommt in einer direkt oder
   indirekt abgeleiteten Klasse nur einmal vor
→ das Subobjekt der virtuellen Basisklasse wandert stets zum
     am weitesten abgeleiteten Objekt
→ dieses Verhalten kann ohne Verwendung virtueller Basisklassen
     nicht nachgebildet werden
- besitzt sie Nicht- Standardkonstruktoren, muss jeder ihrer
  Nachkommen alle Nicht- Standardkonstruktoren der virtuellen
  Basisklasse aufrufen
→ Konstruktor des Subobjektes der virtuellen Basisklasse wird
     vom Konstruktor der am weitesten abgeleiteten Klasse
     aufgerufen

Quellcode
Tags: Klassenbestandteile
Source:
43
Cardlink
0
Was sind Klassenvariablen?
= statische Membervariable = Klassenattribute
- werden sich von allen Exemplaren einer Klasse geteilt
- werden innerhalb der Klasse mit static definiert
- werden außerhalb der Klasse initialisiert

Quellcode
Tags: Klassenbestandteile
Source:
44
Cardlink
0
Was sind Klassenmethoden?
= statische Memberfunktionen
- werden innerhalb der Klasse mit static definiert oder deklariert
- sie können nur auf Klassenvariablen und globale Variablen
  zugreifen

Aufruf
exempar.klassenmethode()      oder
Klasse::klassenmethode()
Tags: Klassenbestandteile
Source:
45
Cardlink
0
Was sind Memberkonstanten?
= konstante Anteile eines Exemplars
- muss bei Erzeugung des Objekts in der Initialisiererliste initialisiert
   werden
- jedes Exemplar besitzt seine eigene Memberkonstante (im
  Gegensatz zu den Klassenvariablen)
- Deklaration der Variable wird const vorangestellt
Tags: Klassenbestandteile
Source:
46
Cardlink
0
Was sind Klassenkonstanten?
= statische Memberkonstanten
= konstante Variablen, die sich alle Exemplare einer Klasse teilen
- werden innerhalb der Klasse static const definiert
          - ganzzahlige Klassenkonstanten können inner- oder
            außerhalb der Klasse initialisiert werden
          - nicht- ganzzahlige Klassenkonstanten müssen außerhalb
            der Klasse initialisiert werden
Tags: Klassenbestandteile
Source:
47
Cardlink
0
Über welche Arten von Membertypen kann eine Klasse verfügen?
- mit typedef vereinbarte Aliase für Typen
- Aufzählungstypen (enum)
- Klassen
- Funktions- und Klassentemplates
Tags: Klassenbestandteile
Source:
48
Cardlink
0
Wie werden Felder in Klassen dimensioniert?
- muss für alle Exemplare einer Klasse gleich dimensioniert sein
- kann ausschließlich wie folgt dimensioniert werden:

- Literalkonstanten: int feld[5];
- Aufzählungskonstanten: enum { g = 5 }; int feld[g];
- integrale Klassenkonstanten: static const int g = 5; int feld[g];
Tags: Klassenbestandteile
Source:
49
Cardlink
0
Welche Zugriffseinschränkungen auf Klassenbestandteile gibt es?
public
- Zugriff von inner- und außerhalb der Klasse

private & protected
- Zugriff von außen eingeschränkt
- ein Exemplar hat uneingeschränkten Zugriff auf Anteile eines
   anderen Exemplars derselben Klasse
- Kapselung kann durch friend- Deklarationen durchbrochen werden
Tags: Klassenbestandteile
Source:
50
Cardlink
0
Was sind friend- Deklarationen?
= Funktion, die auf private und protected Anteile einer Klasse
   zugreifen können
→ durchbrechen die Kapselung und verstoßen somit gegen die
     Prinzipien des abstrakten Datentyps
- freie Funktionen, Klassen- oder Memberfunktionen
- sind gerichtet
     →wenn A den B zum friend erklärt, ist damit B nicht automatisch
         friend von A
- werden nicht vererbt
     → das A- Subobjekt bleibt allerdings auch in allen Unterklassen
          friend von B
- nicht transitiv
     → C ist ein friend von B und B ist ein friend von A, dann ist C nicht
          automatisch friend von A

Quellcode
Tags: Klassenbestandteile
Source:
51
Cardlink
0
Was sind using- Deklarationen?
- bei protected oder private- Vererbung …
          - besteht innerhalb der abgeleiteten Klasse Zugriff auf alle
            public- und protected Member der Basisklasse
          - von außerhalb können über die Schnittstelle der
            abgeleiteten Klasse jedoch keine public- Member
            angesprochen werden
→ durch using- Deklaration kann der Zugriff auf einen Bezeichner
     wieder hergestellt werden
          - muss im public- Teil erfolgen
          - es wird der Funktionsname angegeben, nicht die
            vollständige Signatur
         → alle Überladungen einer Funktion betroffen

Quellcode
Tags: Klassenbestandteile
Source:
52
Cardlink
0
Wie lautet das Law of Demeter?
= only talk to your immediate friends
→ Niemals direkt auf Attribute zugreifen, sondern immer Methoden
     für den lesenden und schreibenden Zugriff verwenden
Law of Demeter macht unempfindlich gegen Änderungen im Code
- Ausnahmen in C++
          - zur Initialisierung von Attributen in der Initialisiererliste
             werden ihre entsprechenden Konstruktoren gerufen
          - existieren keine Zugriffsmethoden auf private- oder
             protected- Attribute, wird direkt auf die Attribute zugegriffen

Strenge Form des Law of Demeter
→ nur eigene Attribute werden direkt angesprochen

Schwache Form des Law of Demeter
→ auch geerbte Attribute werden direkt angesprochen
Tags: Klassenbestandteile
Source:
53
Cardlink
0
Wie kann der Code optimiert werden?
- Entwickler kann den Compiler mögliche Optimierungen anzeigen
Compiler entscheidet, ob und wie er diese durchführt

Beispiele
inline → Vorschlag, dass der Compiler anstelle von Aufrufen der
               betreffenden Funktion die Implementierung dieser Funktion
               einfügen soll
register → Zusatz einer Variablendeklaration, der vorschlägt,
                   diese Variable im Register zu halten ("cachen")
              → Compiler kann auch selbstständig Variablen cachen

Quellcode
Tags: Spezifizierer
Source:
54
Cardlink
0
Was bewirkt volatile?
= Spezifizierer, der anzeigt, dass eine Variable auf keinen Fall
   im Cache abgelegt werden darf
- Übergabeparameter von Funktionen und Memberfunktionen
   können ebenfalls volatile sein
- kann parallel mit const verwendet werden
→ wird beim Überladen von Funktionen berücksichtigt

Quellcode
Tags: Spezifizierer
Source:
55
Cardlink
0
Was bewirkt mutable?
- Bestandteile konstanter Objekte dürfen nicht verändert werden
→ mit mutable spezifizierte Variablen dürfen in konstanten
     Objekten und von als const deklarierten Funktionen dennoch
     verändert werden

Quellcode
Tags: Spezifizierer
Source:
56
Cardlink
0
Was ist ein Namensraum?
- keine selbstständige Übersetzungseinheit
- verhindert Bezeichnerkollisionen
- auch eine Klasse spannt einen eigenen Namensraum auf
- auf einen Bestandteil eines Namensraumes kann unter
  Verwendung des Bereichsoperators :: vollständig qualifiziert  
  zugegriffen werden
- Namensraum kann jederzeit erneut geöffnet werden
- Namensräume können geschachtelt werden
- Import von Funktionen über using
- vereinbaren eines Aliases möglich

Quellcode
Tags: Namensräume
Source:
57
Cardlink
0
Was ist Korrektheit?
Die Fähigkeit einer Software ihre Aufgabe exakt zu erfüllen, wie sie durch Anforderungen und Spezifikationen definiert sind
→ eine Software kann maximal so korrekt wie ihre Spezifikation
     sein
Tags: Vertragsorientierte Programmierung
Source:
58
Cardlink
0
Was ist Robustheit?
Die Fähigkeit einer Software auch unter außergewöhnlichen Bedingungen zu funktionieren, also auch in Fällen, die in der Spezifikation nicht ausdrücklich beschrieben sind
→ Robustheit und Korrektheit sind verschieden
Tags: Vertragsorientierte Programmierung
Source:
59
Cardlink
0
Welche drei Arten von Funktionen zur Definition eines abstrakten Datentyps T gibt es?
Konstruktor- Funktion
→ STACK[X]

Zugriffs- Funktion
STACK[X] → BOOLEAN

Transformationsfunktion
STACK[X] → STACK[X]
Tags: Vertragsorientierte Programmierung
Source:
60
Cardlink
0
Was ist eine partielle Funktion?
- mit →| gekennzeichnet
- kann nicht auf alle Werte des abstrakten Datentyps angewandt
  werden
→ im Abschnitt Vorbedingungen muss Bedingung für die
     Anwendbarkeit der Funktion angegeben sein
Tags: Vertragsorientierte Programmierung
Source:
61
Cardlink
0
Was ist ein Axiom?
- Grundannahme einer Aussage, die nicht weiter bewiesen werden
   muss
Tags: Vertragsorientierte Programmierung
Source:
62
Cardlink
0
Was ist vertragsorientierte Programmierung?
- Beziehung zwischen genutzten und einer sie nutzenden Klasse
- kann als Vertrag aufgefasst werden, dieser regelt:
          - Pflichten des Auftraggebers
          - Gewährleistung einer Leistung durch den Auftragnehmer
→ Realisierung über Zusicherungen
Tags: Vertragsorientierte Programmierung
Source:
63
Cardlink
0
Was sind Zusicherungen?
- zur Angabe der Bedingungen des Aufrufs einer Funktion

Vorbedingung
- muss für den erfolgreichen Aufruf einer Funktion gelten
- muss nur bei Eintritt in die Funktion erfüllt sein
- kann nur den Ausgangszustand und Funktionsargumente
   verwenden

Nachbedingung
- muss nach dem erfolgreichen Aufruf einer Funktion gelten
- muss nur unmittelbar beim Austritt der Funktion erfüllt sein
Tags: Vertragsorientierte Programmierung
Source:
64
Cardlink
0
Was ist eine Klasseninvariante?
- Bedingung, die alle Exemplare einer Klasse stets erfüllen müssen
          - nach der Erzeugung eines Exemplars
          - zusätzlich zur Vor- und Nachbedingung (außer Konstruktoren)
          - während der Ausführung einer Funktion kann sie verletzt sein
Tags: Vertragsorientierte Programmierung
Source:
65
Cardlink
0
Wie hängen formale Spezifikation und vertragsorientierte Programmierung zusammen?
Spezifikation Funktion
Vorbedingung Vorbedingung
Axiom einer Transformationsfunktion Nachbedingung
Axiom einer Zugriffsfunktion Nachbedingung oder Klasseninvariante
Axiom einer Kostruktorfunktion Nachbedingung der Konstruktoren
Tags: Vertragsorientierte Programmierung
Source:
66
Cardlink
0
Wie kann vertragsorientierte Programmierung in C++ realisiert werden?
- assert- Makro für Zusicherungen
- Funktionsrückgabewerte müssen gesichert werden, damit die
  Nachbedingung vor Verlassen der Funktion geprüft werden kann
- Objektzustand zu Beginn einer Funktion muss explizit gesichert
  werden
- die Invariante der abgeleiteten Klasse muss mindestens die
   Invariante der Basis umfassen
- die Vorbedingung der überschreibenden Funktion muss gleich oder
   schwächer der Funktion der Basisklasse sein
- die Nachbedingung der überschreibenden Funktion muss gleich
   oder stärker der Funktion der Basisklasse sein
Tags: Vertragsorientierte Programmierung
Source:
67
Cardlink
0
Wie können in C++ Fehler behandelt werden?
- globale Fehlervariable
- direkte Rückgabe des Fehlerstatus
- Callback- Funktionen
- Exceptions
Tags: Fehlererkennung und -behandlung
Source:
68
Cardlink
0
Wie funktioniert die Fehlerbehandlung über eine globale Variable?
- setzen einer globalen Fehlervariablen, die Auskunft über die Art
   des Fehlers gibt
- wird mit einer Funktion ausgelesen, die die Fehlervariable
   anschießend auf "kein Fehler setzt"
- nach jedem Aufruf einer Funktion muss der Fehlerzustand geprüft
   werden

Nachteile
- Code für den normalen Ablauf und Fehlerbehandlung sind gemischt
→ Code schlecht lesbar und wartbar
- Code wird umfangreicher und komplexer
- Fehlervariable kann überschrieben werden, bevor sie ausgelesen 
   wurde
Tags: Fehlererkennung und -behandlung
Source:
69
Cardlink
0
Wie funktioniert die Fehlerbehandlung über die direkte Rückgabe des Fehlerstatus?
- Rückgabe eines Funktionswertes der anzeigt, ob die Funktion
   erfolgreich durchgeführt wurde

Nachteile
- Code für den normalen Ablauf und Fehlerbehandlung sind gemischt
→ Code schlecht lesbar und wartbar
- Code wird umfangreicher und komplexer
- funktionaler Programmstil ist nicht mehr möglich
Tags: Fehlererkennung und -behandlung
Source:
70
Cardlink
0
Wie funktioniert die Fehlerbehandlung über Callback- Funktionen?
- über einen Funktionszeiger wird eine Funktion zur
  Fehlerbehandlung aufgerufen
- der Funktionszeiger kann auf neue Funktionen zur  
  Fehlerbehandlung gerichtet werden
          - diese können spezielle Fehler behandeln
          - Standardfehlerbehandlungsfunktion kann gerufen werden,
            dazu muss der Wert, des auf sie gerichteten Zeigers
            gesichert werden

Vorteile
- einfach zu erweitern
- der nutzende Code ist nicht mit Code zur Fehlerbehandlung
   durchsetzt

Nachteile
- aufwendig
- oft dennoch Fehlervariablen notwendig
Tags: Fehlererkennung und -behandlung
Source:
71
Cardlink
0
Was ist Ausnahmebehandlung?
- sorgt dafür, dass ein Fehler dort behandelt werden kann, wo er
  verursacht wurde
- am Ort der Fehlerentdeckung wird eine Ausnahme geworfen
- der Code, welcher den Fehler verursacht hat, kann die Ausnahme
   fangen und entsprechend reagieren

→ Programmablauf im Normal- und Fehlerfall sind getrennt
→ nutzender Code ist aber nach wie vor mit
     Fehlerbehandlungscode durchsetzt
Tags: Fehlererkennung und -behandlung
Source:
72
Cardlink
0
Wie werden Ausnahmen geworfen?
(1) sobald eine Ausnahme geworfen wurde, wird der
     Programmablauf beim nächsten Catch- Handler fortgesetzt
(2) alle bis dahin erzeugten Objekte werden zerstört
(3) Funktionsaufrufstapel wird zurückgesetzt

(2) + (3) = Stack- Unwinding

- sollten nicht im Destruktor oder während der Behandlung einer
  Ausnahme geworfen werden

Syntax
throw range_error("Fehlerort und -grund");
Tags: Fehlererkennung und -behandlung
Source:
73
Cardlink
0
Wie werden Ausnahmen spezifiziert?
- Spezifikation im Funktionskopf, welche Ausnahme eine Funktion
   wirft
→ wird zur Laufzeit geprüft

void func();
→ kann alle Ausnahmen werfen

void func() throw();
→ verspricht, keine Ausnahmen zu verfen

void func() throw(range_error, int);
→ verspricht, nur Ausnahmen vom Typ range_error und int zu
     werfen
Tags: Fehlererkennung und -behandlung
Source:
74
Cardlink
0
Was ist ein unvollständig erzeugtes Objekt?
= ein Objekt, in dessen Konstruktor eine Ausnahme geworfen wird,
   wird nicht per Aufruf des Destruktors zerstört
→ je Objekt darf höchstens eine dynamische Ressource beschafft
     werden
→ schlägt deren Beschaffung fehl, muss bzw. darf der Destruktor
     nicht gerufen werden
Tags: Fehlererkennung und -behandlung
Source:
75
Cardlink
0
Wie werden Ausnahmen gefangen?
- jeder Catch- Handler muss den Typ der Ausnahme spezifizieren,
   die er fangen möchte
→ Ausnahme wird gegebenenfalls zum passenden umschließenden
    oder nachfolgenden Catch- Handler weitergeleitet
- es gilt das Typsubstituierbarkeitsprinzip
- auch Ausnahme elementaren Typs (char, double, int, … ) können
  gefangen werden
- Ellipse fängt jede Ausnahme: catch (...) {}
Syntax
try { … }
catch (range_error ausnahme)
{
… Fehlerbehandlung …
}
Tags: Fehlererkennung und -behandlung
Source:
76
Cardlink
0
Welche zwei Strategien zur Behandlung von Ausnahmen gibt es?
Spezifische Catch- Handler fangen spezifische Ausnahmen und behandeln diese vollständig
- nicht gefangene Ausnahmen werden an den nächsten oder
  übergeordneten Catch- Handler weitergeleitet

Spezifische Catch- Handler fangen spezifische Ausnahmen und behandeln diese spezifisch
- dann wird die Ausnahme explizit an den übergeordneten Catch-
  Handler weitergeleitet

- beide Strategien können gemischt wreden
- speziellere Catch- Handler müssen vor den allgemeineren
  kommen
Tags: Fehlererkennung und -behandlung
Source:
77
Cardlink
0
Was ist ein try- Block?
= entspricht einer Transaktion auf einer Datenbank
→ entweder sind alle Aktionen im try- Block erfolgreich oder alle
    Aktionen bleiben wirkungslos
Tags: Fehlererkennung und -behandlung
Source:
78
Cardlink
0
Was ist Stack- Unwinding?
- alle zum Zeitpunkt des Werfens einer Ausnahme offenen
   Funktionen werde terminiert, bis ein geeigneter Catch- Handler
   erreicht wird
- alle bis zum Werfen der Ausnahme nicht-dynamisch vollständig
  erzeugten Objekte werden zerstört
→ entspricht den erwarteten Aufräumarbeiten
Tags: Fehlererkennung und -behandlung
Source:
79
Cardlink
0
Was ist RTTI?
= Run- Time Type Identification / Laufzeit- Typinformation
→ Möglichkeit, um in C++ zur Laufzeit Typinformation abzufragen

- typeid gibt eine konstante Referenz auf ein type_info Objekt
  zurück
<typeinfo> muss inkludiert werden
Tags: Typen
Source:
80
Cardlink
0
Was ist ein Double- Dispatch?
= doppelte Verteilung
- dynamisches binden, aber Methodenaufruf hängt nicht nur vom
  dynamischen Typ des Objektes ab, sondern zusätzlich vom
  dynamischen Typ eines Parameters bzw. zweiten Objektes

Sprache Deutsch Englisch
Deutsch Deutsche Unterhaltung Übersetzung Deutsch → Englisch
Englisch Übersetzung Englisch → Deutsch Englische Unterhaltung

→ doppelte Abhängigkeit
Tags: Typen
Source:
81
Cardlink
0
Was ist eine Multi- Methode?
= multiple Dispatch (mehrfache Verteilung)
= Methoden, deren Auswahl nicht nur anhand des Typs eines
   Objekts getroffen wird, sondern anhand der dynamischen Typen
   mehrerer Objekte
Tags: Typen
Source:
82
Cardlink
0
Was bewirkt typeid?
- wird der Operator auf ein polymorphes Objekt angewendet, ist 
  das Ergebnis eine konstante type_info- Referenz entsprechend
  des dynamischen Typs des Objekts
vtbl muss in der Basisklasse vorhanden sein
- konstante Referenz auf ein type_info- Objekt des betreffenden
   statischen Typs bei Anwendung auf
          - nicht- polymorphe Objekte
          - Literalkonstanten
          - Typen
          - …
Tags: Typen
Source:
83
Cardlink
0
Nenne mögliche Zwecke von Typumwandlungen!
- ein Datentyp soll als anderer Datentyp interpretiert werden
- Typinformation ging verloren und muss wieder hergestellt werden
- die Eigenschaft const soll entfernt werden
- der tatsächliche Typ eines Objekts soll durch eine
  Typumwandlung auf ein Exemplar der abgeleiteten Klasse wieder
  hergestellt werden
Tags: Typen
Source:
84
Cardlink
0
Welche Arten der Typumwandlung gibt es in C?
traditianal cast
(zieltyp)variable

functional calst
zieltyp(variable)
→ wenn Zieltyp ein zusammengesetzter Typ ist, muss zuvor ein
   Alias mittels typedef vereinbart werden

→ sollten in C++ nicht verwendet werden
Tags: Typen
Source:
85
Cardlink
0
Welche cast- Operatoren gibt es in C++?
reinterpret_cast
static_cast
const_cast
dynamic_cast

- einheitlicher Aufbau: cast_name<zieltyp>(argument)
Tags: Typen
Source:
86
Cardlink
0
Was bewirkt reinterpret_cast?
- Argument der Zielumwandlung wird als Zieltyp interpretiert
- Typumwandlung erfolgt zur Laufzeit
- const kann nicht entfernt werden
- sollte nur verwendet werden, wenn kein anderer Cast in Frage
   kommt, beispielsweise wenn der Zieltyp eine Referenz ist
Tags: Typen
Source:
87
Cardlink
0
Was bewirkt static_cast?
- nur implizit erlaubte Typumwandlungen sind zulässig
          - Umwandlung eines beliebigen Zeigerswerts in einen void-
             Zeigerwert und umgekehrt
          - Umwandlung zwischen ganzzahligen und Fließkommawerten
          - Umwandlung eines Zeigers oder einer Referenz auf einen
             Zeiger oder eine Referenz einer abgeleiteten Klasse
             (downcast)
→ kann weder vom Compiler noch zur Laufzeit auf Korrektheit
     überprüft werden
- die Eigenschaften const und volatile können nicht
  entfernt werden
Tags: Typen
Source:
88
Cardlink
0
Was bewirkt const_cast?
- kann ausschließlich die Eigenschaften const, volatile und
   const volatile entfernen
- keine weitere Typänderung möglich
- Zieltyp muss eine Referenz sein
Tags: Typen
Source:
89
Cardlink
0
Was bewirkt dynamic_cast?
- Umwandlung von Zeigern oder Referenzen zu einander
   kompatibler Typen
- Typüberprüfung findet zur Laufzeit statt
- Basisklasse muss über eine vtbl verfügen
Tags: Typen
Source:
90
Cardlink
0
Was ist ein Template?
= eine Schablone für Funktionen oder Klassen
- wird ein Template vollständig ausgeprägt / instanziiert ist das
  Ergebnis eine verwendbare Funktion bzw. Klasse
- ein Template muss mindestens einen Parameter haben
→ Typ- Parameter oder ganzzahlige Parameter

class T → wenn T eine Klasse oder Struktur sein soll
typename T → wenn T ein beliebiger (elementarer) Typ sein kann

Quellcode
Tags: Templates
Source:
91
Cardlink
0
Worin unterscheiden sich Klassen- und Funktionstemplates?
Funktionstemplate
- damit automatisch instanziierbar sind, darf der Template-
  Parameter nicht nur als Rückgabetyp verwendet werden
→ explizite Ausprägung dennoch möglich
- kann überladen, aber nicht spezialisiert werden
     - passende (überladene) Funktionen werden vorrangig
       aufgerufen, sofern keine automatische Typumwandlung
       notwendig ist
     - Template- Aufruf kann erzwungen werden durch
               funktionsname<>( … )

Klassentemplate
- muss immer explizit ausgeprägt werden
- kann spezialisiert werden
- kann analog zu Funktionen Vorgaben besitzen
→ bei der Ausprägung können Parameter mit Vorgaben von rechts
    nach links entfallen

Quellcode
Tags: Templates
Source:
92
Cardlink
0
Wie werden Templates übersetzt?
- Definition des Templates wird übersetzt
          → Entdeckung syntaktischer Fehler
- wird ein Template instanziiert, wird es zum zweiten Mal übersetzt
          → Prüfung, ob Template- Parameter alle impliziten
               Anforderungen erfüllen
→ Compiler muss Template- Definition zugänglich sein, dazu
     müssen diese in der Header- Datei stehen
Tags: Templates
Source:
93
Cardlink
0
Was ist vollständige Spezialisierung?
- abweichende Ausprägung eines Templates für bestimmte
  Parameter
→ wird das Template mit Parametern ausgeprägt, die der
     vollständigen Spezialisierung des Templates entsprechen, wird
     das vollständig spezialisierte Template verwendet

Quellcode
Tags: Templates
Source:
94
Cardlink
0
Was ist partielle Spezialisierung?
=  nur Spezialisierung einen Teils der Parameter eines Templates
- stehen mehrere partielle Spezialisierungen eines Templates zur
  Verfügung, wählt der Compiler zur Ausprägung eines Templates
  das am besten passende Template aus
- auch die spezielle Verwendung (Referenz, Zeiger, … ) eines
  Template- Parameters wird partielle Spezialisierung genannt

Quellcode
Tags: Templates
Source:
95
Cardlink
0
Was sind Member- Templates?
- Klassen und Klassen- Templates können Member- Templates
  besitzen
          - Member- Funktionstemplates
          - Member- Klassentemplates
→ identische Verwendung wie herkömmliche Templates

- beim Zugriff innerhalb eines Templates auf ein Member- Template
  des Template- Parameters muss template verwendet werden
- beim Zugriff innerhalb eines Templates auf ein Member- Typ des
  Template- Parameters muss typename verwendet werden
Tags: Templates
Source:
96
Cardlink
0
Was sind Template- Templates?
- als Template- Parameter kann auch ein Template übergeben
   werden
- vor dem Namen des Template- Template- Parameter muss
  class stehen, struct oder typename sind nicht erlaubt

template <class T1, template <class T2>  class T3>

Quellcode
Tags: Templates
Source:
97
Cardlink
0
Wie wird ein Template ausgeprägt?
- ein Template wird nur so weit ausgeprägt, wie dies erforderlich ist
  (lazy instantiation)
→ Typ- Parameter zulässig, die bei vollständiger Ausprägung des
     Templates zu einem syntaktisch fehlerhaften Programm führen
     würden
- vollständige Ausprägung eines Templates wird erzwungen, indem
  auf template eine Deklaration des Templates einschließlich
  Parameter folgt

template class Y<X>

Quellcode
Tags: Templates
Source:
98
Cardlink
0
Wie kann man von Klassen- Templates erben?
- ein Klassen- Template kann als Basisklasse dienen für
          - eine normale Klasse
       → diese muss alle Template- Parameter des Templates binden
          - ein Klassen- Template
       → dieses muss mindestens einen Template- Parameter an das
            Basisklassen- Template weiterreichen

- ein Klassen- Template kann vom Template- Parameter erben

Quellcode
Tags: Templates
Source:
99
Cardlink
0
Wie funktioniert der Name Lookup in Templates?
- hängt ein Name innerhalb eines Templates nicht explizit vom
  Template- Parameter ab, wird beim name lookup der Template-
  Parameter nicht mit einbezogen
→ damit der Template- Parameter mit einbezogen wird, muss der
    Name vom Template- Parameter abhängig gemacht werden
          - this->hello();
                    → Suche im vollständig ausgeprägten Typ
          - T::hello()
                    → Suche in T
          - Basis<T, size>::hello()
                    → Suche im Template Basis<T, size>, von dem
                          abgeleitet wurde
Tags: Templates
Source:
100
Cardlink
0
Wie funktioniert der Standard- Konstruktor für elementare Typen?
- eine lokale nicht- initialisierte Variable elementaren Typs besitzt
  einen zufälligen Wert, das heißt ihr Standardkonstruktor tut nichts
→ wenn in Templates Exemplare von Typparametern angelegt
     werden, empfiehlt sich der explizite Aufruf des
     Standardkonstruktors
→ Datenmember vom Typ des Typparameters sollte in der 
     Initialisierliste mit dem Aufruf des Standardkonstruktors explizit
     initialisiert werden

Quellcode
Tags: Templates
Source:
101
Cardlink
0
Was ist Metaprogrammierung?
- das Schreiben von Programmen, die andere Programme, oder
  sich selbst, untersuchen und verändern
- Metaprogramme sind Programme über sich selbst oder andere
  Programme, zum Beispiel Compiler, Interpreter, Makros, …
          - werden meist zur Laufzeit (dynamisch) ausgeführt
Tags: Templates
Source:
102
Cardlink
0
Was ist ein Template- Metaprogramm?
- werden vom Compiler zur Übersetzungszeit (statisch) ausgeführt
- Templates bilden eine Turing- vollständige Untersprache von C++
Tags: Templates
Source:
103
Cardlink
0
Was ist die STL und wie lauten ihre Basiskonzepte?
= Standard Template Library

Behälter
- Datenstrukturen zur Speicherung von Elementen
- Definieren geeigneter Iteratoren als Membertypen
- Definieren spezifisch optimierter Algorithmen als
   Memberfunktionen
Iteratoren
- von der Art des Behälters abstahierender Zugriff aus seine
   Elemente
- je nach Behälter und Verwendungszweck verfügt ein
   Iterator über unterschiedlicher Eigenschaften
Algorithmen
- Verarbeiten in Behältern gespeicherte Elemente
- der Zugriff auf die in Behältern enthaltenen Elemente erfolgt
   ausschließlich über Iteratoren
Tags: STL
Source:
104
Cardlink
0
Was sind STL- Behälter?
= container
- ähnlich zu einem Feld
→ eine Sammlung von Elementen gleichen Typs, aber
            - passt seine Größe automatisch an
            - stellt Methoden zur Bearbeitung seiner Elemente bereit
            - Zugriff erfolgt einheitlich über Iteratoren
- liegt als Klassen- Template vor
Tags: STL
Source:
105
Cardlink
0
Was sind Sequenzen?
= extern sortierte Behälter
- mehrere Methoden zum Erzeugen, Einfügen und Löschen

Beispiele
list
vector
deque
queue
stack
Tags: STL
Source:
106
Cardlink
0
Was sind sortierte assoziative Behälter?
- intern sortiere Behälter, die jeweils ein Schlüssel- Wert- Paar
   verknüpfen

map
- speichert Schlüssel- Wert- Paare
- Schlüssel muss eindeutig sein
multimap
- Schlüssel darf mehrfach vorkommen

set
- speichert Elemente, die nur aus Schlüssel bestehen
- Elemente sind selbst- assoziativ
- es kann nur getestet werden, ob ein Element existiert
- jedes Element darf nur einmal vorkommen
multiset
- Schlüssel darf mehrmals Vorkommen
Tags: STL
Source:
107
Cardlink
0
Was ist ein Hash- Behälter?
= Streuspeicher, Hast- Tabelle
- Elemente sind weder intern noch extern sortiert
→ bei Traversierung werden Elemente in einer ungeordneten
    zufälligen Reihenfolge geliefert
- ist üblicherweise niemals vollständig gefüllt
- Hash- Funktion errechnet aus dem Schlüssel eine Indexposition,
  unter der das Element gespeichert wird
Tags: STL
Source:
108
Cardlink
0
Was ist ein bitset?
- spezieller Behälter zur Speicherung und Verarbeitung von
  Bitfolgen fester Größe
- Bits werden gepackt abgelegt, sodass ein einzelnes Bit auch
  tatsächlich nur ein Bit Speicher belegt

→ ähnlich zur vollständigen Spezialisierung von vector<bool>,
     dieses hat aber eine variable Größe
Tags: STL
Source:
109
Cardlink
0
Welche Arten von Iteratoren gibt es?
- Input- Iterator
- Output- Iterator
- Forward- Iterator
- Bidirectional- Iterator
- Random- Access- Iterator
- Stream- Iterator
- Reverse- Iterator
- Insert- Iterator
Tags: STL
Source:
110
Cardlink
0
Was ist ein Input- & Output- Iterator?
- sequentielles Lesen bzw. Schreiben von Daten
  (Behälter, Datei, …)
- zurückspringen an eine bereits gelesene Stelle ist nicht möglich,
  da kein Dekrement- Operator definiert
Tags: STL
Source:
111
Cardlink
0
Was ist ein Forward- Iterator?
- kann wie ein Input- und Output- Iterator vorwärts bewegt werden
- kann außerdem kopiert werden, um einen Behälter ab der
  kopierten Position erneut zu durchlaufen
Tags: STL
Source:
112
Cardlink
0
Was ist ein Bidirectional- Iterator?
- verfügt über alle Eigenschaften eines Forward- Iterators
- zusätzlich implementiert er den Dekrement- Operator
→ kann auch rückwärts laufen analog zu einer doppelt verketteten
    Liste
Tags: STL
Source:
113
Cardlink
0
Was ist ein Random- Access- Iterator?
- verfügt über alle Eigenschaften eines Bidirectional- Iterators
- zusätlich implementiert er den Index- Operator
→ wahlfreier Zugriff auf Elemente eines Behälters
Tags: STL
Source:
114
Cardlink
0
Was sind Stream- Iteratoren?
- dienen dem Lesen und Schreiben sequenzieller Ströme
- Input- Iterator: istream_iterator
- Output- Iterator: ostream_iterator
Tags: STL
Source:
115
Cardlink
0
Was ist ein Reverse- Iterator?
= Hülle für einen bidirektionalen oder einem Random- Access-
   Iterator
- durchläuft die Elemente eines Behälters in umgekehrter
   Reihenfolge
- rbegin() verweist auf des letzte Element eines Behälters
- rend() verweist auf die Position unmittelbar vor dem ersten Element
Tags: STL
Source:
116
Cardlink
0
Welche Insert- Iteratoren gibt es?
front_insert_iterator
- fügt Elemente am Behälteranfang ein
- Behälter muss über push_front() verfügen

back_insert_iterator
- fügt Elemente am Behälterende ein
- Behälter muss über push_back() verfügen

insert_iterator
- fügt Elemente an beliebiger Stelle an
- Behälter muss über insert() verfügen
Tags: STL
Source:
117
Cardlink
0
Was sind Assoziationen?
= Verbindung zwischen zwei oder mehreren Objekten
- meist werden Objekte unterschiedlicher Klassen verbunden
- werden nach ihrer Festigkeit unterschieden
          - Komposition
          - Aggregation
          - Assoziation
Tags: Assoziationen
Source:
118
Cardlink
0
Was ist eine Komposition?
- festeste Verbindung
- das enthaltene Objekt (B) wird zusammen mit dem enthaltenden
  Objekt (A) erzeugt und zerstört
- das enthaltene Objekt kann in der Regel nicht ausgetauscht
   werden oder unabhängig vom enthaltenden Objekt existieren
Tags: Assoziationen
Source:
119
Cardlink
0
Was ist eine Aggregation?
- feste Verbindung
- das aggregierende (A) und das aggregierte Objekt (B) können
  vorübergehend unabhängig voneinander existieren
- das aggregierte Objekt zusammen mit dem aggregierenden
  Objekt zerstört es sei denn, es wurde zuvor getauscht
Tags: Assoziationen
Source:
120
Cardlink
0
Was ist eine Assoziation?
- weiche Verbindung
- assoziierendes und assoziiertes Objekt existieren voneinander
  unabhängig
- assoziiertes Objekt wird vom assoziierenden nicht zerstört, wenn
  dieses zerstört wird
Tags: Assoziationen
Source:
121
Cardlink
0
Was ist Kardinalität?
= Multiplizität
- sagt aus, wie viele Objekte miteinander in Verbindung stehen
- wird in Blickrichtung auf die andere Klasse notiert
          → ein A assoziiert 0..n B
          → ein B assoziiert genau ein A
0..1  ein Objekt kann, muss aber nicht assoziiert sein
1..1 genau ein Objekt muss assoziiert sein
0..n / 0..* beliebig viele Objekte können assoziiert sein
1..n ein oder viele Objekte können assoziiert sein
Tags: Assoziationen
Source:
122
Cardlink
0
Welche Standard- Text- Ströme gibt es?
= textuelle Ströme, welche bei Programmstart automatisch
   geöffnet werden

Strom Beschreibung
cin Standardeingabe
cout Standardausgabe 
cerr ungepufferte Standfehlerausgabe
clog gepufferte Standardfehlereingabe
Tags: Ströme
Source:
123
Cardlink
0
Was sind String- Ströme?
- eine besondere Form textueller Ströme
- erlauben es, Ein- und Ausgaben in C++- Strings im Speicher zu
  puffern
- dienen beispielsweise der Formatierung von Ausgaben für GUIs
- können als textueller Datenpuffer im Hauptspeicher betrachtet
   werden
- können überall dort eingesetzt werden, wo istream, ostream oder
  iostream erwartet wird
- ends zur Terminierung eines C- Strings
Tags: Ströme
Source:
124
Cardlink
0
Was sind binäre Ströme?
- können zum lesen, schreiben oder für beides geöffnet werden
- wahlfreier Zugriff möglich
- Zugriff erfolgt byte- oder blockweise
- Lesen und Schreiben erfolgt meist über read() und write()
Tags: Ströme
Source:
125
Cardlink
0
Welche Lese- Operationen gibt es?
istream& getline ( istream& is, string& s, char delim = '\n')
- liest aus dem Eingabestrom is eine ganze Zeile bis zum
  Delimeter delim und schreibt sie in den String s

get()
- mehrfach überladen
- liest ein oder mehrere Zeichen ein

peek()
- erlaubt Vorschau auf das nächste Zeichen

istream& putback(char c)
- stellt das zuletzt gelesene Zeichen c wieder in den Eingabestrom
  zurück

istream& ignore( int n, int delim = EOF)
- entnimmt n Zeichen aus dem Eingabestrom und verwirft sie
Tags: Ströme
Source:
126
Cardlink
0
Wie wird eine Datei geöffnet?
- Datei kann mit entsprechenden Strom- Konstruktor sofort
   geöffnet werden:
          ifstream eingabedatei("dateiname");

- wird Konstruktor ohne Argument aufgerufen, muss die Datei
  später explizit geöffnet werden:
          ifstream eingabedatei;
          eingabedatei.open("dateiname");
Tags: Ströme
Source:
127
Cardlink
0
Wie wird eine Datei geschlossen?
- beim Erreichen der Deklaration eines Dateiobjekts schließt der
  Destruktoraufruf die Datei automatisch
- kann vorher explizit geschlossen werden: eingabedatei.close();
Tags: Ströme
Source:
128
Cardlink
0
Welche Dateifehler gibt es und wie werden sie abgefragt?
Konstante Beschreibung Abfrage
goodbit alles ok bool good() const
eofbit Ende des Stroms bool eof() const
failbit letzte Operation war fehlerhaft bool fail() const
badbit ungültige Operation bool bad() const


- ist badbit gesetzt, ist der Strom nicht mehr benutzbar
- ist failbit oder badbit gesetzt, werden alle folgenden E/A-
  Operationen ignoriert
- rdstate() const gibt den Stromstatus als Bitmaske zurück
Tags: Ströme
Source:
129
Cardlink
0
Wie kann der Stromstatus gesetzt werden?
void clear(iostate state= goodbit)
- Status auf angegebene Bitmaske setzen

void setstate (iostate state)
- einzelnes Statusbit setzen
- alle anderen Bits bleiben unberührt
Tags: Ströme
Source:
130
Cardlink
0
Wie können Zustände repräsentiert werden?
- Zustandsimplementierung mit booleschen Variablen
- Zustandsimplementierung mit Bitmasken
- Zustandsimplementierung mit Aufzählungstypen und -konstanten
- Entwurfsmuster State
Tags: Zustände
Source:
131
Cardlink
0
Was ist State?
- das Entwurfsmuster State löst zustandsspezifisches Verhalten
  aus einem Objekt heraus und repräsentiert unterschiedliche
  Zustände und entsprechendes Verhalten als Objekte
  verschiedener Klassen
→ die verschiedenen Zustandsklassen verfügen über eine
    gemeinsame (abstrakte) Basisklasse
- ein Exemplar der ursprünglichen Klasse besitzt einen Zeiger, der
  je nach Zustand auf ein anderes Zustandsobjekt gerichtet ist
Tags: Zustände
Source:
132
Cardlink
0
Was ist ein Widget?
- Zusammenziehung aus window und gadget
- Bezeichnung für alle grafisch- interaktiven Bestandteile, die
  separat eingebunden und manipuliert werden können
Tags: GUI
Source:
133
Cardlink
0
Wie funktioniert die Speicherverwaltung in GTKmm?
- GTKmm folgt dem Standard- Lebenszyklus von Objekten
→ein GTK- Objekt als Member einen Klasse wird mit dem
    Exemplar der Klasse erzeugt und zerstört
→ ein in einer Funktion oder einem Block erzeugtes GTK- Objekt
     wird beim Verlassen der Funktion / des Blocks
     zerstört
Tags: GUI
Source:
134
Cardlink
0
Was sind managed widgets?
- wird mit dem Funktionstemplate manage() markiert und zu
   einem Container hinzugefügt
→ der enthaltende Container zerstört das zu ihm gehörende
     dynamisch erzeugte Widget
Tags: GUI
Source:
Flashcard set info:
Author: David
Main topic: Wirtschaftsinformatik
Topic: Grundlagen der Softwareentwicklung
School / Univ.: Universität Leipzig
City: Leipzig
Published: 19.07.2010
Tags: OOGP, C++, Eisenecker
 
Card tags:
All cards (134)
Assoziationen (5)
Fehlererkennung und -behandlung (12)
GUI (3)
Hilfswerkzeuge (14)
Klassenbestandteile (11)
Namensräume (1)
Objektorientierung (21)
Operatoren (6)
Spezifizierer (3)
STL (14)
Ströme (8)
Templates (13)
Typen (11)
Vertragsorientierte Programmierung (10)
Zustände (2)
Report abuse

Cancel
Email

Password

Login    

Forgot password?
Deutsch  English