Einführung in C++ mit Microsoft VS



Ähnliche Dokumente
Vorkurs C++ Programmierung

Zählen von Objekten einer bestimmten Klasse

C# im Vergleich zu Java

Alltagsnotizen eines Softwareentwicklers

Objektorientierte Programmierung

Grundlagen von Python

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

Einführung in die Programmierung

Einführung in die C++ Programmierung für Ingenieure

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

Deklarationen in C. Prof. Dr. Margarita Esponda

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

Objektorientierte Programmierung mit C++ Vector und List

Programmieren in Java

Java: Vererbung. Teil 3: super()

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Die Programmiersprache C99: Zusammenfassung

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Einführung in die Java- Programmierung

3 Objektorientierte Konzepte in Java

Propädeutikum. Dipl.-Inf. Frank Güttler

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

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

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

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

Installation und Inbetriebnahme von Microsoft Visual C Express

Java Virtual Machine (JVM) Bytecode

Programmierkurs Java

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

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

Tutorium Rechnerorganisation

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

Software Engineering Klassendiagramme Assoziationen

C A R L V O N O S S I E T Z K Y. Boost C++ Libraries. Johannes Diemke. Department of Computer Science Learning and Cognitive Systems

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Einführung in die Informatik Tools

Java Einführung Abstrakte Klassen und Interfaces

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

Klausur in Programmieren

C/C++-Programmierung

Einführung in die Programmierung (EPR)

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

Große Übung Praktische Informatik 1

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

.NET Code schützen. Projekt.NET. Version 1.0

Updatehinweise für die Version forma 5.5.5

Vererbung & Schnittstellen in C#

Innere Klassen in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Computeranwendung und Programmierung (CuP)

Algorithmen und Datenstrukturen

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Objektbasierte Entwicklung

SEPA-Anleitung zum Release 3.09

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

Fakultät Angewandte Informatik Lehrprofessur für Informatik

SJ OFFICE - Update 3.0

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Datentypen: Enum, Array, Struct, Union

Installation von Microsoft Visual C Express

Einführung in die Programmierung mit C++

1. Übung zu "Numerik partieller Differentialgleichungen"

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

Programmieren Tutorium

1 Vom Problem zum Programm

4 Vererbung, Polymorphie

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Modellierung und Programmierung 1

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

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

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

Programmierpraktikum 3D Computer Grafik

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

BEISPIELKLAUSUR Softwareentwicklung:

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

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

Grundlagen. Kapitel 1

Übung zur Vorlesung Programmieren in C

Einführung in die C-Programmierung

Software Engineering Klassendiagramme Einführung

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Objektorientierung: Klassen und Objekte

Software Engineering Interaktionsdiagramme

Java Einführung Collections

Client-Server-Beziehungen

SEP 114. Design by Contract

Klassenbeziehungen & Vererbung

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

Programmierkurs Java

DLLs (dynamic loaded libraries) mit MingW erstellen

Objektorientiertes Programmieren für Ingenieure

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Von der UML nach C++

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

Einführung in die Programmierung

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Transkript:

Einführung in C++ mit Microsoft VS

Gliederung Allgemeines zu C++ und Unterschiede zu Java Header-Files Zeiger/Strukturen Namespaces Programmierstil Einführung in Microsoft VS Projekte und Solutions Debugger Tipps und Tricks

C++ vs. Java

Rückblick: Klassen und Objekte Klasse ist ein Objekttyp --- Objekt ist eine Instanz einer Klasse Objekte bestehen aus Daten (Membervariablen) und zugehörigen Funktionen (Memberfunktionen) statische Variablen von einer Klasse gibt es nur einmal pro Prozess eine Änderung einer statischen Variable wirkt sich auf alle Instanzen aus statische Funktion: Aufruf ohne Instanz dürfen aber nicht auf nicht statische Member zugreifen computeavgseq nur virtuelle Funktionen in vererbten Klassen können überschrieben werden und werden zur Laufzeit bestimmt abstrakte Klassen: nicht alle virtuellen Funktionen sind implementiert keine Objekterzeugung möglich

Einfache Datentypen int: ganze Zahl unsigned int: natürliche Zahl bool: Wahrheitswert double, float: Gleitkommazahl char: Byte, Zeichen int rufnummer; rufnummer = 28917058; double temperatur = 10.3; bool sommerzeit = true;

Strukturen und Aufzählungen Array : Zusammenfassung von Elementen desselben Typs int rufnummern[10]; rufnummern[0] = 28917058; Struct : Zusammenfassung von Elementen bel. Typs struct TelefonbuchEintrag { string Nachname; string Vorname; int Vorwahl; int Rufnummer; }; Enum : Menge spezifischer Werte (wird benutzt wie int) TelefonbuchEintrag.Nachname = Ryu"; TelefonbuchEintrag.Vorname = Hilla"; TelefonbuchEintrag.Vorwahl = 089; TelefonbuchEintrag.Rufnummer = 28917058; enum Bier { Augustiner, Loewenbraeu, Becks }; void f(bier biertype) { if (biertype == Augustiner) drink(); }

Die Header-Datei sämtliche Definitionen und Deklarationen, die dann in der.cpp-datei implementiert werden sämtliche Präprozessoranweisungen (z.b. #include) sollten nach Möglichkeit NUR in die Header-Datei geschrieben werden 1. Klassendeklaration 2. Typdefinition 3. Aufzählungen 4. Funktionsdeklaration 5. Konstantendefinition 6. Memberdatendeklaration 7. Präprozessoranweisungen class MyClass {... }; struct Position { int x, y }; enum Ampel { rot, gelb, grün }; int rechteckflaeche(int w, int h); const float pi = 3.141593; int m_number; #include <iostream> #define VERSION 12 #ifdef cplusplus

Die Header-Datei class MyClass : MyParentClass { // die Klasse MyClass erbt von MyParentClass public: // jeder kann auf diese Funktionen / Daten zugreifen MyClass(); //Standardkonstruktor MyClass(std::string text); //zweiter Konstruktor virtual ~MyClass(); //Destruktor myclass.h virtual int func()=0; //eine rein virtuelle (=abstrakte) Funktion static double funct(); //eine statische Funktion static int m_somenumber; //eine statische Membervariable protected: // Zugriff innerhalb der Klasse und durch abgeleitete Klassen virtual int fun(); //eine virtuelle Funktion private: // Zugriff nur innerhalb der Klasse void fu(); //eine Funktion std::string m_somestring; //eine Membervariable }

Die Implementierung #include myclass.h myclass.cpp MyClass::MyClass(){ m_somenumber = 5; m_somestring = Eine Intialisierung vom Text ; } //Standardkonstruktor MyClass::MyClass(std::string text){ m_somenumber = 5; m_somestring = text; } //zweiter Konstruktor MyClass::~MyClass(){} //Destruktor void MyClass::fu(){} //eine Funktion int MyClass::fun(){return m_somenumber;} //eine virtuelle Funktion double MyClass::funct(){return 2.0;} //eine statische Funktion

Warum Zeiger? Telefonbuch t; string suchbegriff; t.neuereintrag( ); t.neuereintrag( ); Eintrag e; e = suche(suchbegriff, t); Funktionsparameter und Rückgabewerte können Geschwindigkeit beeinträchtigen Eintrag suche(string s, Telefonbuch t) { // kopiert beim Aufruf das ganze Telefonbuch... return e; } Eintrag suche(string* s, Telefonbuch* t) { // kopiert nur 4 Byte... return e; } Eintrag* suche(string* s, Telefonbuch* t) { // wenn man den Eintrag ändert, ändert sich // auch der im Telefonbuch!... return e; }

Zeiger und Referenz Ein Zeiger (MyClass*) zeigt auf einen Speicherbereich Es gibt Nullzeiger (Nullpointer) MyClass object; MyClass* objectpointer; MyClass& ref = object; Eine Referenz (MyClass&) ist wie ein neuer Name für ein bestehendes Objekt Es gibt keine Nullreferenz JAVA kennt nur die Mischung aus beiden

Umwandlung Die gleichen Zeichen werden bei Umwandlungen benutzt & (Adress Operator) vor einem Objekt bedeutet Ich hätte gern den Speicherort vom Objekt MyClass object; MyClass* objectpointer; objectpointer = &object; object = *objectpointer; * (Dereference Operator) vor einem Zeiger (bzw. Speicherort) bedeutet Ich hätte gern die Referenz (bzw. das Objekt) zum Zeiger

Wozu das ganze? Geschwindigkeit! Effizientes Programmieren mittels Zeigerarithmetik // ein Byte Array (10MByte) um den Wert 5 erhöhen char* array = new char[10000000]; for (int i=0; i < 10000000; ++i){ array[i] += 5; } delete[] array; Folgende Implementierung ist schneller array i endofarray char* array = new char[10000000]; //zeigt auf erstes Element char* endofarray = array+10000000; //zeigt auf letztes+1 Element for (char* i=array; i < endofarray; ++i){ (*i) += 5; //Wert des Elements, auf das Zeiger i zeigt } delete[] array;

Keller und Halde (Stack und Heap) Es gibt zwei Möglichkeiten Speicher für seine Objekte zu bekommen: Stack: Speicher wird wieder überschrieben, nachdem die Variable aus dem lokalen Namensraum verschwindet Heap: Speicher wird erst wieder freigegeben, wenn man delete aufruft Bei JAVA kommen alle Objekte auf den Heap; der GarbageCollector gibt es dann wieder frei MyClass mo1; // Stack MyClass* mo2 = new MyClass(); // Heap Fehlerquelle Nr. 1!

Tipps zu Zeigern (Pointer) und Referenzen zu new gehört in JEDEM Fall ein delete Man sollte sich angewöhnen, alle Pointer mit 0 zu initialisieren und vor delete auf 0 zu überprüfen Zu new MyClass[42] gehört delete[] MyClass* object = new MyClass(); : delete object; MyClass* object = 0; if(object) delete object;

const Deklaration Funktion, bei der die Parameterwerte nicht verändert werden Eintrag& meinefunktion(const string& s, const Telefonbuch& t); Funktion, bei der keine Membervariablen (auch nicht indirekt) geändert werden (außer mutable Membervariablen) Eintrag& meinefunktion(meinobject& mo1, meinobject& mo2)const; Funktion, bei der die Rückgabewerte später nicht mehr geändert werden dürfen const Eintrag& meinefunktion(meinobject& mo1, meinobject& mo2);

Tipps zu const Compiler prüft den Code zu const Deklarationen und zeigt gegebenfalls einen Fehler (keine Warnung!) Man muss nicht mit const programmieren, aber es hilft const immer von rechts nach links lesen! const MyClass* ist ein Pointer auf ein konstantes Objekt. Der Pointer kann geändert werden, muss aber auf ein konstantes Objekt zeigen. MyClass const* ist ein konstanter Pointer auf ein Objekt. Der Pointer ist konstant kann aber auf konstante und nicht-konstante Objekte zeigen. const MyClass const* ist ein konstanter Pointer auf ein konstantes Objekt.

Coding Guidelines - Funktionen Eine Funktion sollte nicht mehr als eine Seite beinhalten Die Funktionalität des Codes sollte durch Kommentare beschrieben sein Alle öffentlichen und geschützten Funktionen und Variablen sollten Kommentare im Header haben Variablendeklaration sollte in der Nähe des ersten Aufrufs sein Destruktoren sollten immer virtuell sein (virtual ~MyObject im Header)

Coding Guidelines - Namen Der Sinn sollte erkennbar sein (computearea, width, result) Keine zu ähnlichen Namen (myreference, myrefer) Englisch (oder die offizielle Sprache des Projektes) Membervariablen wird m_ vorangestellt (m_width) In allen Variablen und Funktionen sind die Anfangsbuchstaben klein, in weiteren Wortteilen groß In Klassennamen sind die Anfangsbuchstaben groß

Coding Guidelines - Datenfluss Const benutzen Es gibt keinen vernünftigen Grund für globale Variablen, Funktionen oder anderes Man muss nicht immer alles mit Vererbungshierarchien lösen nur wenn es die Aussage trifft

Coding Guidelines - Fehlersuche Din A4 Blatt mit seinen Lieblingsfehlern anlegen Compiler-Warnungen haben ihren Sinn! Linkerfehler haben 3 Hauptursachen Die.lib Datei wurde nicht im Projekt nicht (korrekt) angegeben Der Pfad für die.lib Datei wurde nicht (korrekt) angegeben Es gibt die Funktion im Header, aber nicht in der cpp Datei (mit der korrekten Signatur)

Coding Guidelines - Bibliotheken Man muss nicht das Rad neu erfinden STL (Standard Template Library) sollte man kennen und auch verwenden std::vector (std::list, std::map) statt Arrays Suchalgorithmen gibt es schon std::string erlaubt meist bessere Handhabung als char * Vieles gibt es schon in vernünftiger Qualität mit einer freundlichen Lizenz

Die Standardbibliothek STL Viele elementare Algorithmen und Datenstrukturen sind darin vorimplementiert die wichtigsten Header sind vector, set, algorithm,. include <iostream> include <vector> int main() { std::vector<int> vec; for (int i = 0; i < 5; ++i) { vec.push_back(i); } vec.insert(vec.begin(), 5); return 0; } Vector enthält am Schluss: 5 0 1 2 3 4

Standardbibliotheken Weitere wichtige Header sind cmath, string, iostream, include <iostream> include <string> int main(){ std::string s = Was ist die Lösung? ; std::cout << s << std::endl; std::cin >> t; if( t.compare( per aspera ad astra ==0) ){ std::cout << Richtig! << std::endl; } return 0; }

Microsoft VS

Integrierter Debugger Kompilieren im Debugmodus: Der Compiler fügt dem Code zusätzliche Informationen hinzu, die das Programm semantisch nicht verändern Es finden keinen zusätzlichen Optimierungen mehr statt Breakpoints im Quellcode: Man kann das Programm Schritt für Schritt im Programmtext ausführen (obwohl das Programm nach wie vor im Binärcode läuft!)

Haltepunkte (Breakpoints) Das Programm hält immer am Haltepunkt, wenn es im Debugmodus kompiliert wurde UND im Debugmodus gestartet wurde (F5) Unter Haltepunkteigenschaften bearbeiten kann man unten im Dialog Bedingungen an den Haltepunkt knüpfen, ohne den Code zu ändern Es gibt mehrere Fenster in dem man Variablen ansehen (und auch verändern!) kann Beobachten: Hier kann man auf der linken Seite Variablen eintragen Auto: Hier sind automatisch Vorschläge für Variablen enthalten Natürlich sind nur Variablen möglich, die an dieser Stelle im Code bekannt sind!

Aufrufliste (Call stack) In der Aufrufliste kann man sehen, von wo die Funktion in der der Haltepunkt ist, aufgerufen wurde Mit einem Doppelklick kann man in die Funktion springen, die aufgerufen hat dann kann man sich auch die Variablen ansehen, die in der Funktion bekannt waren

Ändern und Kompilieren (Edit and Compile) VS bietet die Möglichkeit, das Programm zu unterbrechen, eine Änderung vorzunehmen, zu kompilieren und an der unterbrochenen Stelle fortzufahren! Ist aus technischen Gründen nicht immer möglich, aber kann sehr hilfreich sein

Ein Schritt zurück wäre der Traum aller Programmierer, aber ist technisch nicht korrekt realisierbar Wenn man den gelben Pfeil im Debugger hochzieht, wird nicht der Programmlauf (mit Variablen) zurückgespult, sondern das Programm führt als nächsten Befehl den Befehl nach der Pfeilspitze aus