Objektorientierte Programmierung mit C++ Dr. K. Ahrens

Ähnliche Dokumente
0. Einführung & Motivation

Einführung in C ++ und die Objektorientierte Programierung

Programmieren 3 C++ Prof. Peter Sommerlad Fredy Ulmer

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

Einleitung. Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Kurzeinführung in C/C++

C++ - Eine Ubersicht fur Java-Programmierer

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

Programmierkurs C++ Grundlagen. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

1.5. Strukturierte Anweisungen

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg

Algorithmen und Datenstrukturen

Ziele. C und C++ Was ist C? Übersicht. Überblick. C und C++ im Vergleich zu anderen Programmiersprachen einordnen können

1.4. Funktionen. Objektorientierte Programmierung mit C++

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Kommunikation. Björn und Georg

Short Introduction to C# C# (C SHARP) Microsofts Antwort auf Java

Kurze Einführung in die Programmiersprache C++ und in Root

Datenbankanwendungsprogrammierung Crashkurs Java

Gebundene Typparameter

Java: Der Einstieg. Algorithmen und Datenstrukturen II 1

Funktionales C++ zum Ersten

Repetitorium Informatik (Java)

Algorithmen zur Datenanalyse in C++

Fachhochschule Wiesbaden - Fachbereich DCSM. Skriptsprachen. Moderne, objekt-orientierte Skriptsprachen mit Betonung auf Ruby

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

4. Objektorientierte Programmierung mit C++

Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10. computer graphics & visualization

Der Goopax Compiler GPU-Programmierung in C++ ZKI AK-Supercomputing, Münster, , Ingo Josopait

Vorkurs Informatik WiSe 15/16

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Java Einführung Methoden. Kapitel 6

6 Speicherorganisation

Unterlagen. CPP-Uebungen-08/

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Zählen von Objekten einer bestimmten Klasse

3D Programmierpraktikum: Einführung in C++ - Teil 1

CORBA Implementierung von Client und Server

Distributed Computing Group

Primitive Datentypen

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Theorie zu Übung 8 Implementierung in Java

1. Übung zu "Numerik partieller Differentialgleichungen"

Übersicht. Race Conditions Buffer Overflows Heap Overflows Exkurs: Stackaufbau bei Intel x86 Exkurs: Shellcode Stack Overflows

virtual Wertpapier& operator=(const Wertpapier&); // VIRTUELLE ZUWEISUNG protected: static enum {wortfeldlaenge = 20}; char* name_z; double kurs; };

Vergleich verschiedener OO-Programmiersprachen

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Grundlagen von C# - 1

Tag 4 Repetitorium Informatik (Java)

Einführung in C++ mit Microsoft VS

AuD-Tafelübung T-B5b

Effizientes Memory Debugging in C/C++

Die einfachsten Anweisungen

Java für C++ Programmierer

Objektorientierte Programmierung

Informatik I (D-MAVT)

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Die Programmiersprache C Eine Einführung

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Einführung in C#.NET. 1 Übersicht. 2 Typen (Types) Dieser Artikel stammt aus dem Magazin von C++.de (

Von Java nach C++ Dr. Frank Weichert Lehrstuhl Informatik VII Technische Universität Dortmund

C++ Programmierung. Uwe Naumann. LuFG Informatik 12, RWTH Aachen University, Germany

0. Einführung. C und C++ (CPP)

Grundlagen der Informatik 11. Zeiger

Von Java nach C++ Frank Weichert, Heinrich Müller Informatik VII Universität Dortmund

Algorithmen zur Datenanalyse in C++

1 Polymorphie (Vielgestaltigkeit)

Einführung in die Programmierung 1

Algorithmen und Programmierung II

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache:

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

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

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme


Grundlagen der Programmierung Prof. H. Mössenböck. 15. Pakete

Welche Informatik-Kenntnisse bringen Sie mit?

C-Grundlagen. Einführung von Tronje Krabbe 1/21

Programmentwicklung mit C++ (unter Unix/Linux)

Zeiger, Arrays und Strings in C und C++

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

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

C#Objektorientierte. Aleksandra Maj. Programmiersprachen. Programmiersprachen am Beispiel C# Referat im Rahmen des Seminars. 15.

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen

Codingstandard. Softwareentwicklung Praktikum Stand:

Der C++ Crashkurs v1.0

Einstieg in die Informatik mit Java

C++ IN DER EMBEDDED-ENTWICKLUNG WAS DRAN IST AN DEN VORURTEILEN

Algorithmen zur Datenanalyse in C++

Einführung in die Programmierung Wintersemester 2016/17

JAVA - Methoden

Praxisorientierte Einführung in C++ Lektion: "Dynamische Speicherverwaltung"

C# im Vergleich zu Java

Java Einführung Methoden in Klassen

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

Organisatorisches. Einführung in die Programmierung in C Hochschule Regensburg Universitätsstraße 31, Regensburg

Vorlesung Programmieren

Prof. W. Henrich Seite 1

Transkript:

1

0. Einführung & Motivation Ansatz: "C++ für Java-Kenner" Konzentration auf semantische Unterschiede 'gleichartiger' Konzepte Erörterung der C++ -spezifischen Konzepte (Overloading, Templates) Anspruch auf Vollständigkeit Sprache laut Standard ISO/IEC 14882 von 2011 incl. Standardbibliothek (STL and more) Schwerpunkt auf Diskussion von Konzepten anhand von Beispielen 2

0. Einführung & Motivation Warum noch eine OO-Sprache? die zudem syntaktisch sehr ähnlich zu Java ist älter ist als Java... 'gefährlicher' ist als Java... Weil C++ eine Sprache ist die syntaktisch sehr ähnlich zu Java ist älter ist als Java... 'gefährlicher' ist als Java... -- und potenziell effizienteren Code ermöglicht http://www.research.att.com/~bs/applications.html 3

0. Einführung & Motivation Java zahlreiche Sicherheitsvorkehrungen kosten Zeit & Raum virtual machine architekturneutral C++ keinerlei Sicherheitsvorkehrungen Reserven für Zeit & Raum native code architekturabhängig 4

Ein erster Blick: Hello World Java Hello.java class Hello { public static void main(string s[]) { if (s.length < 1) return; Hello h = new Hello(", " + s[0]); h.speak(); String what; void speak() { System.out.println("Hello" + what); Hello(String s) { this.what = s; protected void finalize() { System.out.println("bye, bye"); 5

Ein erster Blick: Hello World C++ h.cc Java-Style #include <iostream> #include <string> class Hello { public: static void main(int c, char* v[]) { if (c < 2) return; Hello h = Hello(", "+std::string(v[1])); h.speak(); private: std::string what; virtual void speak() { std::cout << "Hello" + what << std::endl; Hello(std::string s) { this->what = s; ~Hello() { std::cout << "bye, bye" << std::endl; ; // 6

Ein erster Blick: Hello World C++ h.cc Java-Style //... continued int main(int argc, char* argv[]) { Hello::main(argc, argv); 7

Ein erster Blick: Hello World C++ h0.cc C - Style #include <cstdio> int main(int argc, char* argv[]) { if (argc > 1) std::printf("hello, %s\n", argv[1]); 8

Ein erster Blick: Hello World in C++ kann man offenbar Java-like (OO) programmieren, muss es aber nicht: C++ ist eine sog. multi-paradigm-sprache Abweichungen in syntaktischen Feinheiten semantische Unterschiede Java: Hello h = new Hello(...); // reference h.speak(); C++: Hello h = Hello(...); // value h.speak(); 9

Ein erster Blick: Hello World In C++ muss jeder verwendete Bezeichner zuvor (oder in der gleichen Klasse) deklariert werden (auch Bezeichner aus der Standard-Bibliothek) #include <string>... std::string statt /usr/include/g++/string String (--->java.lang.string) 10

Ein erster Blick: Hello World In C++ gibt es globale Funktions- (Variablen- und Typ-) Deklarationen Es gibt geschachtelte Gültigkeitsbereiche (Klassen und namespaces) aber ohne implizite Abbildung auf eine hierarchische Verzeichnisstruktur Ein Compilerlauf behandelt GENAU EINE Quelldatei pro Aufruf (... make ) Dies entspricht dem klassischen Paradigma der Übersetzung von C-Programmen: ermöglich Migration, Portierbarkeit, Unix-Konformität 11

Ein erster Blick: Hello World In C++ gibt es Zeiger, Felder sind de facto Zeiger - keine Objekte, this ist ein Zeiger Konvention des Programmaufrufs ist etwas anders Virtualität ist explizit zu spezifizieren Es gibt sog. Destruktoren Syntax von Zugriffsrechten ist etwas anders 12

Der zweite Blick: Effizienz Problem 1: integer - Arithmetik 3 10n (modulo int-overflow) Problem 2: double - Arithmetik e ~ (1+ 1/n) n [ n = 10e8, 10e9, 10e10 ] 13

Der zweite Blick: Effizienz class i { public static void main(string []s) { int i=1; long bei 10 10 for(int n=1; n<=100000000;++n) i*=3; System.out.println( i ); Java 10000000000L bei 10 10 14

Der zweite Blick: Effizienz #include <iostream> class i { public: static void main() { long bei 10 10 ; int main() { i::main(); return 0; int i=1; 10000000000L bei 10 10 for(int n=1; n<=100000000;++n) i*=3; std::cout << i << std::endl; C++ 15

Der zweite Blick: Effizienz class d { public static void main(string []s) { double e=1; for(int n=1; n<=100000000;++n) e*=1.00000001; System.out.println( e ); Java 16

Der zweite Blick: Effizienz #include <iostream> class d { public: static void main() { double e=1; for(int n=1; n<=100000000;++n) e*=1.00000001; std::cout << e << std::endl; ; int main() { d::main(); return 0; // not needed but good style C++ 17

Der zweite Blick: Effizienz Laufzeiten (Debian Linux, Pentium4 2 GHz) Java C++ 0,56 1,55 (1.5 jit) (g++ 4.1.2 O2) 8,3 4,66 14,32 ~ 2 0,25 0,35 8,4 9,2 ~ 4 10,0 2,11 3,52 int double 10 8 10 9 10 8 10 9 18

Der zweite Blick: Effizienz Laufzeiten (Solaris 5.8, UltraSparc [8x]1050 MHz) Java C++ 0,42 (1.5 jit) 5,2 2,18 ~ 1,5 0,29 (g++ 3.3.2, -O2) 6,6 1,92 int 0,61 7,8 ~ 1,5 10 4,75 0,38 3,82 double 10 8 10 9 10 8 10 9 19

Der zweite Blick: Effizienz Laufzeiten (Win XP, Pentium M 1,8 GHz) Java C++ 0,58 (1.5 jit) 7,4 4,29 ~ 4 0,20 (VC++8.0, /O2) 4,7 0,94 int 0,75 7,8 ~ 2 8,0 5,85 0,36 2,91 double 10 8 10 9 10 8 10 9 20

Der zweite Blick: Effizienz (up to date :-) Laufzeiten (Mac OS X 10.9, 1.86 GHz Intel Core 2 Duo) Java (1.6.0_35 64-Bit Server VM) C++ (clang++ 5.0 64-Bit -O3) ~25 Mb 16 Threads 2,04 20,4 ~ 3.7 0,57 5,59 10 1.17... 2,24 9,8 3,29 19,1 62,8 2,81 9,9 27,98 ~500 Kb 1 Thread int double 10 9 10 10 10 9 10 10 21

C++ Historie Bjarne Stroustrup Ph.D. Arbeit 1978/79 an der Universität Cambridge: Alternative Organisationsmöglichkeiten der Systemsoftware in verteilten Systemen erste Implementation in Simula auf IBM360 (Simula67, NCC Oslo) Stroustrup: Die Entwicklung des Simulators war das reinste Vergnügen, da Simula nahezu ideal für diesen Zweck erschien. Besonders beeindruckt wurde ich durch die Art, in der die Konzepte der Sprache mich beim Überdenken der Probleme meiner Anwendung unterstützten. Das Konzept der Klassen gestattete mir, die Konzepte meiner Anwendung direkt einzelnen Sprachkonstrukten zuzuordnen. So erhielt ich Programmcode, der in seiner Lesbarkeit allen Programmen anderer Sprachen überlegen war, die ich bisher gesehen hatte. Simula - Compiler damals mit extrem schlechten Laufzeiteigenschaften 22

C++ Historie S.: Um das Projekt nicht gänzlich abzubrechen - und Cambridge ohne Ph.D. zu verlassen -, schrieb ich den Simulator ein zweites Mal in BCPL.... Die Erfahrungen, die ich während des Entwickelns und der Fehlersuche in BCPL sammelte, waren grauenerregend. erste Ideen zu C++ im Kontext von Untersuchungen Lastverteilung in UNIX-Netzen bei den Bell Labs Murray Hill, New Jersey: Stroustrup: Ende 1979 hatte ich einen lauffähigen Präprozessor mit dem Namen Cpre geschrieben, der C um Simula-ähnliche Klassen erweiterte. -> C with classes 23

C++ Historie C with classes 1979 1983 1985 erste Nennung von C++ 1987 Cfront 1.0, 1. Aufl. The C++ Programming Language Cfront 1.2 (noch in Quelle verfügbar), g++1.0 ANSI X3J16 1.Treffen 1. Auflage ARM, Templates, Exception Handling 1989 1990 1993 1994 1998 RTTI, namespaces 1. Entwurf ANSI/ISO Standard 2003 Standard ISO/IEC 14882 2011 C++ TR1 Standard C++11 24

Java vs. C++: Different by Design Java starke Anlehnung an C++ Deployment Schema: Interpretation OO ist (nahezu) zwingend primäres Kriterium: Komfort diverse (und zumeist nicht abschaltbare) implizite Overheads zu Lasten der Effizienz Prüfung von Feldgrenzen Reflection Garbage Collection Objects by Reference Semantik 25

Java vs. C++: Different by Design C++ starke Anlehnung an C Deployment Schema: Compilation OO ist möglich, nicht zwingend primäres Kriterium: Effizienz keinerlei impliziter Overhead zu Lasten der Effizienz keine Prüfung von Feldgrenzen (fast) kein Laufzeitabbild von Klassen keine automatische Speicherverwaltung Objects by Value Semantik 26

Objects by Reference Java: Variablen vom Klassentyp sind IMMER Referenzen X x; // implizit == null x = new X(); X y = x; // ein Objekt mit zwei Referenzen Objekte werden IMMER dynamisch (auf dem Heap) erzeugt 27

Objects by Reference class A { private int i; public void foo() { i++; public void out() { System.out.print(i); public A() { i=0; public static void bar(a a){ a.foo(); public static void main(string s[]) { A a1 = new A(); A a2 = a1; a1.foo(); a2.foo(); a1.out(); a2.out(); bar(a2); a1.out(); a2.out(); $ javac A.java $ java A???? 28

Objects by Reference class A { private int i; public void foo() { i++; public void out() { System.out.print(i); public A() { i=0; public static void bar(a a){ a.foo(); public static void main(string s[]) { A a1 = new A(); A a2 = a1; a1.foo(); a2.foo(); a1.out(); a2.out(); bar(a2); a1.out(); a2.out(); $ javac A.java $ java A 2233$ 29

Objects by Value C++: Variablen vom Klassentyp sind (primär) Werte X x; // ein Objekt X y = x; // ein weiteres Objekt als Kopie des ersten Objekte können global, (Stack-) lokal und dynamisch erzeugt werden Es gibt auch Objektreferenzen und -Zeiger 30

Objects by Value #include <iostream> class A { int i; public: void foo() { i++; void out() { std::cout << i; A() { i=0; static void bar(a a) { a.foo(); ; int main() { A a1=a(); A a2=a1; a1.foo(); a2.foo(); a1.out(); a2.out(); A::bar(a2); a1.out(); a2.out(); $ g++ -o a a.cc $ a???? 31

Objects by Value #include <iostream> class A { int i; public: void foo() { i++; void out() { std::cout << i; A() { i=0; static void bar(a a) { a.foo(); ; int main() { A a1=a(); A a2=a1; a1.foo(); a2.foo(); a1.out(); a2.out(); A::bar(a2); a1.out(); a2.out(); $ g++ -o a a.cc $ a 1111$ 32