Geben Sie kurze Antworten auf die folgenden Fragen:
// Deklaration
class A;
// Defintion
class A{};
// Unterschied:
// Deklaration: Informiert über die Existenz einer Klasse/Funktion,
// kann beliebig of in verschiedenen TUs existieren
// Definition: Implementiert eine Klasse/Funktion,
// kann laut ODR nur einmal existieren
1) Kann ein C++-Programm aus mehreren Dateien bestehen? Ja
Kann es aus mehreren .cc-Dateien bestehen? Ja
2) Geben Sie ein Beispiel für eine Deklaration und für eine Definition an.
Was ist der Unterschied?
3) Nennen Sie drei C++-Container der STL.
std::vector, std::array, std::list, std::deque, std::stack, std::map
4) Sie haben eine Klasse "Krokodil" geschrieben ohne einen Konstruktor zu schreiben. Hat diese Klasse einen Konstruktor? Falls ja, wie nennt man ihn?
Ja, "Krokodil" hat einen Konstruktor! Default-Constructor
5) Wie definiert man Namespaces und wofür sind sie gut?
Über das "namespace" Keyword und geschweifte Klammern
Mit Namespaces kann man K/T/F mit einem Präfix versehen und sie so trennen um naming conflicts zu verhindern
5) Nennen Sie drei C++-Anweisungen mit denen Sie den Kontrollfluss beeinflussen können.
if, for, switch, while, goto
6) Wie können Templates dafür sorgen unnötige Wiederholungen im Code zu vermeiden?
Man kann mit Templates generischen Code, also für mehrere Typen schreiben, s.d. insgesamt weniger Code notwendig ist.
7) Nennen Sie zwei Vorteile, die die Verwendung eines Buildsystems bietet.
8) Sie implementieren ein großes C++-Projekt und teilen Ihren Code in mehrere Header auf. Wie können Sie es vermeiden den Inhalt eines Headers mehrfach in Ihr Programm einzubinden (was zu Kompilierfehlern führen würde)?
Über die Verwendung von Headerguards, s.d. der Präprozessor den Code nur einmal inkludiert.
9) Was sind Referenzen, und wofür nutzt man sie (Anwendungsbeispiel)?
Referenzen in C++ sind Aliases (alternative Namen) für bestehende Objekte.
Ein Anwendungsfall für Referenzen ist call-by-reference (outputparameter in Funktionen)
void swap(int& i, int& j)
{
int tmp = i;
i = j;
j = tmp;
}
int main()
{
int x, y;
// ...
swap(x,y);
// ...
}
a)
b)
c)
d)
e)
a)
b)
c)
d)
e)
Recap der Aufgabe:
#include <array>
class Triangle{
public:
using value_type = double;
using point = std::array<value_type, 2>;
Triangle(const std::array<point, 3>& values) : _corners{values} {};
Triangle() : _corners{} {};
// precond: i in (0,1,2)
const point& getCorner(int i) const {
return _corners[i];
}
// precond: i in (0,1,2)
point& getCorner(int i) {
return _corners[i];
}
point& setCorner(int i, const point& other) {
return _corners[i] = other;
}
private:
std::array<point, 3> _corners;
};
Triangle operator+(const Triangle& a, const Triangle& b) {
auto result = Triangle{};
for(int i = 0; i < 3; i++){
const auto& a_i = a.getCorner(i);
const auto& b_i = b.getCorner(i);
result.setCorner(i, Triangle::point{(a_i[0] + b_i[0]) / 2,
(a_i[1] + b_i[1]) / 2});
}
return result;
}
#include <iostream>
#include <string>
// Is apparently already given
class Image {};
class PencilBase {
public:
virtual Image return_icon() const;
virtual void change_color(std::string color);
virtual void print_color() const;
};
class Pencil : public PencilBase {
std::string _color;
Image _image;
public:
Image return_icon() const override {
return _image; //
};
void change_color(std::string color) override {
_color = color; //
};
void print_color() const override {
std::cout << "Color: " << _color << "\n";
};
};
// Aufgabenstellung: Das soll funktionieren
void check_pencil(PencilBase &pencil) {
Image image = pencil.return_icon();
pencil.change_color("blue");
pencil.print_color();
}
Viel Erfolg in der Klausur!