C/C++-Programmierung



Ähnliche Dokumente
C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Typumwandlungen bei Referenztypen

Vorkurs C++ Programmierung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Vererbung & Schnittstellen in C#

Prinzipien Objektorientierter Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Java: Vererbung. Teil 3: super()

Programmieren in Java

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

2. Programmierung in C

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Software Engineering Klassendiagramme Assoziationen

Klausur in Programmieren

Kapitel 12: Übersetzung objektorienter Konzepte

5. Abstrakte Klassen

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Objektorientierte Programmierung

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Objektbasierte Entwicklung

Objektorientierte Programmierung

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

C/C++ Programmierung

Java Einführung Operatoren Kapitel 2 und 3

Programmierkurs Java

Zählen von Objekten einer bestimmten Klasse

Von der UML nach C++

Kapitel 4. Mehrfachvererbung. Beispiel 1: typische Diamant Struktur. Person. Hiwi

Numerische Datentypen. Simon Weidmann

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Fakultät Angewandte Informatik Lehrprofessur für Informatik

4D Server v12 64-bit Version BETA VERSION

OO Softwareentwicklung

Algorithmen und Datenstrukturen

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

2. Semester, 2. Prüfung, Lösung

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

Programmierkurs Java

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

7DVWH.HOOQHU. Kassensystem SANYO (X&D6RIWKapitel 42

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Einführung in die Programmierung

BEISPIELKLAUSUR Softwareentwicklung:

Javakurs zu Informatik I. Henning Heitkötter

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Klassenbeziehungen & Vererbung

Einführung in die Programmierung

Übung - Arbeiten mit Android

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

Popup Blocker/Sicherheitseinstellungen

Einführung in die Java- Programmierung

Kapitel 6. Vererbung

Objektorientierte Programmierung OOP

Nokia Karten für S40 Bedienungsanleitung

Betreuung und Unterstützung Einrichten der DFÜ-Verbindung für einen KISS-Rechner mit dem Internet Explorer

How-to: Webserver NAT. Securepoint Security System Version 2007nx

Anleitung für IQES-Verantwortliche Persönliche Konten verwalten

C/C++ Programmierung

Java Virtual Machine (JVM) Bytecode

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Probeklausur Softwareengineering SS 15

Meine ZyXEL Cloud. Tobias Hermanns V0.10

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

FIS: Projektdaten auf den Internetseiten ausgeben

Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden. mitp

Installation des Add-Ins für Lineare Algebra in Microsoft Excel

Dokumentation. Passwortgeschützte Webseite anlegen

Programmieren - Vererbung & Polymorphie

SEP 114. Design by Contract

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Programmieren Tutorium

Installationshinweise für Serverbetrieb von Medio- Programmen

Alltagsnotizen eines Softwareentwicklers

Anleitung Outlook 2002 & 2003

1. Gruppen anlegen in Outlook

Aufgabe 6 Excel 2013 (Fortgeschrittene) Musterlösung

Applet Firewall und Freigabe der Objekte

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Der schnelle Weg zu Ihrer eigenen App

Download unter:

Große Übung Praktische Informatik 1

Java Kurs für Anfänger Einheit 5 Methoden

Studentische Lösung zum Übungsblatt Nr. 7

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Kurzbedienungsanleitung. Abteilungs-ID. Canon imagerunner C1028i + C1028iF

1. Weniger Steuern zahlen

Transkript:

1 C/C++-Programmierung new/delete, virtual, Typumwandlungen Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010

2 new/delete X* x = new X (23); delete x; X* x = new X[ n ](); // Nur Standardkonstruktor moeglich delete [] x; new besorgt Speicher und ruft Konstruktor des Objekts auf delete ruft Destruktor auf und gibt Speicher frei Nicht mit malloc()/free() mischen! free(new X); undefiniert Analog new [] und delete [] für Reihungen Konstruktionsreihenfolge: 0, 1,..., n 1 Destruktionsreihenfolge: n 1, n 2,..., 0 Reihenfolge wichtig bei Ausnahmebehandlung new [] nicht mit delete (oder umgekehrt) mischen! delete new X[10]; undefiniert Bei Fehlschlag wirft new eine bad_alloc-ausnahme gibt niemals Nullzeiger zurück

3 new und native Datentypen new int ; // uninitialisiert new int (); // 0 new int [10]; // uninitialisiert new int [10](); // alle 10 mit 0 initialisiert Normalerweise zum Aufruf des Standardkonstruktors Angabe von () redundant Außer bei nativen Datentypen (Zahlen, Zeiger)

4 virtual struct X { void f() { cout << "X::f()\ n"; ; struct Y : X { void f() { cout << "Y::f()\ n"; ; int main () { X* x = new Y (); x->f (); // Ausgabe : X::f() Normalfall: Methoden sind nicht virtuell Modifikator virtual C++-Konzept: You don t pay for what you don t use struct X { virtual void f() { cout << "X::f()\ n"; ; struct Y : X { virtual void f() { cout << "Y::f()\ n"; ; int main () { X* x = new Y (); x->f (); // Ausgabe : Y::f()

5 Virtuelle Destruktoren struct A { ~A() { cout << "A ::~ A ()\ n"; ; struct B : A { ~B() { cout << "B ::~ B ()\ n"; ; void f() { A* a = new B; delete a; // undefiniert! Destruktoren sind im Normalfall ebenfalls nicht virtuell Ausgabe oben: nur A::~A() Wenn der dynamische Typ nicht mit statischem übereinstimmt ist das Verhalten undefiniert! Destruktor mit virtual markieren, dann Ausgabe: B ::~ B() A ::~ A()

6 Abstrakte Methoden struct A { virtual void f() = 0; ; struct B : A { virtual void f() { /*... */ ; void f() { A a; // Fehler! Klasse hat abstrakte Methode B b; // OK Virtuelle Methode ohne Implementierung in dieser Klasse Klasse mit abstrakten Methoden kann nicht instanziiert werden Erst Unterklassen, die alle abstrakten Methoden implementieren, können instanziiert werden

7 Typumwandlungen C bietet nur (Typ)x Erfüllt verschiedene Funktionen int nach float void* nach int* int const* nach int* Zahl nach Zeiger C++ bietet feinere Unterscheidung const_cast static_cast dynamic_cast reinterpret_cast Idee: Mehr Sicherheit bieten, Typumwandlungen im Quelltext stärker hervorheben

8 const cast Erlaubt nur hinzufügen/entfernen von const Hinzufügen sicher und redundant Entfernen eventuell unsicher Wenn verwiesenes Objekt nicht veränderbar, dann Verhalten undefiniert void f( int * x) { int const * a = const_cast < int const * >( x); // Sicher int * b = const_cast < int * >(a); // Erlaubt float * c = const_cast < float const * >( x); // Fehler

static cast Umwandlung zwischen arithmetischen Typen (int, float,... ) Umwandlung von Unterklasse in Oberklasse (sicher, redundant) Umwandlung von Oberklasse in Unterklasse undefiniert, wenn Oberklassenzeiger/-referenz nicht auf Objekt der Unterklasse zeigt Umwandlung von void* in andere Zeigertypen undefiniert, wenn verwiesenes Objekt nicht von diesem Typ struct A {; struct B : A {; struct C : B {; struct D {; void f() { B b; A& a = static_cast <A& >( b); // Sicher C& c = static_cast <C& >( b); // Undefiniert! D& d = static_cast <D& >( b); // Fehler 9

dynamic cast Umwandlung von Unterklasse in Oberklasse (sicher, redundant) Umwandlung von Oberklasse in Unterklasse Wird zur Laufzeit geprüft, bei Fehlschlag: Zeigertyp: Nullzeiger Referenztyp: Ausnahme (bad_cast) Typ muss polymorph sein, d.h. muss eine virtuelle Methode besitzen struct D {; struct A : D { virtual ~A() { ; struct B : A { virtual ~B() { ; struct C : B { virtual ~C() { ; void f() { B b; A* a = dynamic_cast <A* >(& b); // Redundant C* c = dynamic_cast <C* >(& b); // Nullzeiger D* x = &b; B* y = dynamic_cast <B* >( x); // Fehler : D nicht polymorph 10

11 reinterpret cast Sonstige Umwandlungen Bitmuster des Operanden wird im Kontext des Zieltypen interpretiert Ganzzahl nach Zeiger Z.B. benötigt für Hardwareansteuerung: Register der Karte befindet sich an Adresse 0x1234 Manches immernoch nicht erlaubt, z.b. float nach Zeiger (auch mit C-Cast nicht möglich)