Sie sind auf Seite 1von 14

Zentralübung 2

Algorithmen und Datenstrukturen


Sommersemester 2021

Prof. Harald Räcke


Ruslan Zabrodin

Technische Universität München


Structs in C
#include<stdio.h>
#include <stdlib.h>

struct Rectangle {
int width, height, area;
};

int main () {
struct Rectangle *f = (struct Rectangle*) \
malloc(sizeof(struct Rectangle));
// Zugriff mittels (*f).width
(*f).width = 5;
printf("width:␣%d␣\n", (*f).width);
// Zugriff mittels f->width
f->width = 7;
printf("width:␣%d␣\n", f->width);
return 0;
} 2
Structs in C
struct Rectangle {
int width, height, area;
};

void init_rectangle(struct Rectangle *r) {


r->width = 0;
r->height = 0;
r->area = 0;
}

int main () {
struct Rectangle *r = (struct Rectangle*) \
malloc(sizeof(struct Rectangle));
init_rectangle(r);
// ...
printf("area:␣%d", r->area);
return 0;
} 3
Structs in C

Mögliche Fehlerquellen:
� Init Funktion wird vergessen
� Width wird verändert, aber area nicht
� Zu viel oder zu wenig Speicher allokiert
� ...

4
Mögliche Verbesserungen

� “Zugriffsrechte“ für Variablen


� “Automatische Ausführung“ der Init Funktion
� Speicherallokation vereinfachen
� ...

5
Private/Public in C++
� Sowohl Variablen als auch Methoden können private/public
sein
� Private: Variable/Methode ist nur innerhalb der Klasse sichtbar
� Public: Auf die Variable/Methode kann man auch außerhalb
der Klasse zugreifen
� Klasse: standardmäßig alles private
� Struct: standardmäßig alles public

class Foo {
int a;
public:
int getA() {
return a;
}
}

6
Konstruktoren und Destruktoren in C++
Konstruktor:
� Wird beim Erstellen des Objektes aufgerufen
� Allokiert eigene Resourcen
Destruktor:
� Wird beim Löschen des Objektes aufgerufen
� Löscht eigene Resourcen

struct Foo {
Foo() {
printf("Constructor␣called");
}
~Foo(){
printf("Destructor␣called");
}
}

7
Speicherverwaltung in C und C++
� In C
void* malloc(size_t size);
void* calloc(size_t n, size_t size);
void free(void *ptr);
� In C++
new
delete und delete[]

int main () {
Foo* f = new Foo;
// ...
delete f;
}

8
Klassen in C++
class Rectangle {
int width, height, area;
public:
Rectangle() {width = height = area = 0;}
int getWidth() {return width;}
int getHeight() {return height;}
int getArea() {return area;}
int setWidth(int w) {width = w;}
int setHeight(int h) {height = h;}
}

int main () {
Rectangle *r = new Rectangle();
printf("area:␣%d", r->area)
delete r;
return 0;
}
9
Q&A

� Wo wird der Speicher für f im Adressraum allokiert?

#include <stdio.h>

struct Foo {
int data; A) Globale Variablen
}; B) Heap
C) Stack
int main() {
D) Programm
Foo f;
return 0;
}

10
Q&A

� Wo wird der Speicher für das Objekt auf das f zeigt im


Adressraum allokiert?

#include <stdio.h>

struct Foo {
int data; A) Globale Variablen
};
B) Heap
int main() { C) Stack
Foo *f = new Foo; D) Programm
delete f;
return 0;
}

11
Speicherverwaltung in C und C++

Foo f = new Foo;


delete f;

int *a = new int[10];


delete[] a;

int *b = new int[0];


delete[] b;

int c[] = {1, 2, 3};

int *d = new int[3] {1, 2, 3};

12
Klasse Student
class Student {
char* vorname;
char* name;
int mat_nr;

public:
Student(char* v, char* n, int mnr) {}
~Student() {}

char* getVorname() {return vorname;}


};

int main() {
Student s("Muster", "Musterstudent", 12435);
printf("%s", s.getVorname());
}

13
Programmieraufgabe: Konstruktor/Destruktor

Implementieren Sie einen Konstruktor und einen Destruktor für die


Klasse Student:
� Student(char* v, char* n, int mnr);

� ~Student();

14