c++ - einführung in die programmierung · c++ | 06.05.15 seite 2 modularisierung logische...
TRANSCRIPT
Leibniz Universität IT Services | Anja Aue
C++ - Einführung in die Programmiersprache
Header-Dateien und Funktionen
C++ | 06.05.15 Seite 2
Modularisierung
Logische Gliederung von Programmteilen mit Hilfe von Namensräumen.
Aufteilung von einem sehr großen Programm in mehrere Quelltext-Dateien.
C++ | 06.05.15 Seite 3
Module
Header-Datei.h
function(typ p1, typ p2)
#präprozessor
Code.cpp
function(typ p1, typ p2){}
#präprozessor
Modul
C++ | 06.05.15 Seite 4
Modul
Einheit aus Deklaration und Implementierung eines Projekts Module können wieder verwendet werden. Strukturierung von großen Software-Projekten.
C++ | 06.05.15 Seite 5
Quelldateien (*.cpp)
Quellcode eines Programms in der Programmiersprache C++. Implementierung der Funktionalität in einem Projekt.Schreiben
von Funktionen zu einem Thema. Bereitstellung einer Steuerzentrale für das Projekt (main.cpp). Quelldateien werden vom Compiler in Objektdateien (*.o)
übersetzt.
C++ | 06.05.15 Seite 6
main.cpp
#include "temperatur.h"#include <iostream>using namespace std;
int main() { double ergebnis; double temperatur = 1.0; char einheit; einheit = 'F'; ergebnis = umrechnung_temperatur(einheit, temperatur); cout << "\nUmrechnung von Celsius nach " << einheit << ": " << ergebnis; return 0;
} Be
isp
iele
/_0
80
1_
Mo
du
l_m
ain
...
C++ | 06.05.15 Seite 7
Quelldatei „Definition von Funktionen“
#include "temperatur.h"
void celsius_to_fahrenheit(double *temperatur){ double fahrenheit = 0; fahrenheit = *temperatur * 1.8 + 32; *temperatur = fahrenheit;}
void celsius_to_kelvin(double &temperatur){ temperatur = temperatur + 273;}
Be
isp
iele
/_0
80
1_
Mo
du
l_qu
elle
...
C++ | 06.05.15 Seite 8
Header-Dateien (*.h)
Inhaltsverzeichnis zu einer Quelltextdatei. Alle notwendigen Deklarationen für die Implementierung. Definition von Prototypen von Funktionen. Instruktionen für den Compiler. Quellcode, der in mehreren Dateien eingebunden werden kann. Schnittstelle nach außen.
C++ | 06.05.15 Seite 9
Header-Datei
#ifndef TEMPERATUR_H#define TEMPERATUR_H
#include <iostream>
using namespace std;
void celsius_to_fahrenheit(double *);void celsius_to_kelvin(double &);double umrechnung_temperatur(char, double);
#endif /* TEMPERATUR_H */
Be
isp
iele
/_0
80
1_
Mo
du
l_qu
elle
he
ad
er.
..
C++ | 06.05.15 Seite 10
Standard-Headerdateien einbinden
Die Standardverzeichnisse des C++-Compilers werden nach der Header-Datei durchsucht.
Falls die Header-Datei nicht gefunden wird, wird ein Fehler ausgegeben.
#include iostream ><
#include name ><
C++ | 06.05.15 Seite 11
Beispiele für Standard-Headerdateien
<iostream>. Ein- und Ausgabe. <string>. Arbeiten mit Zeichenfolgen. <cmath> oder <math>. Mathematische Funktionen. <ctime> oder <time>. Zeit- und Datumsfunktionen.
C++ | 06.05.15 Seite 12
Hinweise
Standard-Header-Dateien, die als Präfix ein c besitzen, verweisen auf Header-Dateien aus der Programmiersprache C.
Header-Dateien der Standardbibliothek werden in den Verzeichnis include des C++-Compilers gespeichert.
Auflistung von Header-Dateien: http://de.cppreference.com/w/cpp/header.
C++ | 06.05.15 Seite 13
Include-Ordner in NetBeans
Tools – Options. Aktivierung der Kategorie C/C++. Registerkarte Code Assistance. Registerkarte C++ Compiler. Die Ordner include werden in der angegebenen Reihenfolge
nach einer passenden Header-Datei durchsucht.
C++ | 06.05.15 Seite 14
Eigene Headerdateien einbinden
Die Header-Datei (das Inhaltsverzeichnis) hat den gleichen Namen wie die dazugehörige Quelldatei (die einzelnen Kapitel in Form von Funktionen).
Standardmäßig wird zuerst im aktuellen Verzeichnis des Projekts nach der angegebenen Header-Datei gesucht.
#include temperatur.h " "
#include name.h ""
C++ | 06.05.15 Seite 15
NetBeans: Eigene Header-Dateien einbinden
Rechter Mausklick auf den Projektnamen. Im Kontextmenü wird der Eintrag Properties ausgewählt. Die Kategorie Build – C++Compiler wird aktiviert. Im Abschnitt General kann mit Hilfe der drei Punkte zu dem
Element Include Directories die benötigten Pfade eingebunden werden.
C++ | 06.05.15 Seite 16
Präprozessor-Anweisungen
Beginn mit einem Hash (#). Ein Semikolon am Ende einer Präprozessor-Anweisung
erzeugt eine Warnung. Pro Zeile ist eine Präprozessor-Anweisung erlaubt. Anweisungen für den Präprozessor stehen immer am Anfang
einer Datei.
C++ | 06.05.15 Seite 17
Symbolische Konstanten
Definition einer symbolischen Konstanten. In diesem Beispiel ist die Konstante leer. Für den Namen der Konstanten werden Großbuchstaben und
der Unterstrich genutzt.
#define TEMPERATUR_H
#define name
C++ | 06.05.15 Seite 18
Ist die symbolische Konstante definiert?
#ifndef TEMPERATUR_H#define TEMPERATUR_H
#endif /* TEMPERATUR_H */
Die bedingte Präprozessor-Anweisung beginnt mit #ifndef und endet mit #endif.
If not definied then... Falls die symbolische Konstante nicht definiert ist ...
Mit Hilfe dieser Bedingung wird eine Mehrfacheinbindung von Definitionen in eine Header-Datei verhindert.
C++ | 06.05.15 Seite 19
Funktionsprototypen
Der Funktionskopf wird als Prototyp für eine Funktion genutzt. Die Deklaration und Definition von Funktionen werden getrennt. Definition einer Schnittstelle nach außen. Irgendwo in diesem Programm existiert eine Funktion ...
C++ | 06.05.15 Seite 20
… für den Compiler
Korrekter Umgang mit dem Rückgabewert einer Funktion. Überprüfung, ob die korrekte Anzahl von Parametern
übergeben werden. Überprüfung, ob die Parameter mit den richtigen Datentypen
übergeben werden.
C++ | 06.05.15 Seite 21
Beispiele
void celsius_to_fahrenheit(double *);
void celsius_to_kelvin(double &);
double umrechnung_temperatur(char, double);
C++ | 06.05.15 Seite 22
)
Prototypen
datentyp (fktName
datentyp (
p01
fktName
)void (fktName p01
typ , typ
void (fktName typ , typ
;
;
)
)
;
;
C++ | 06.05.15 Seite 23
Hinweise
Funktionsprototypen werden in einer Header-Datei oder am Anfang einer Quelldatei geschrieben.
Funktionsprototypen enden mit einem Semikolon. Die Parameterliste enthält beliebig viele Parameter. Für jeden
Parameter wird der Datentyp im Prototypen angegeben, aber nicht der Name.
C++ | 06.05.15 Seite 24
Default-Parameter
double umrechnung_temperatur(double, char einheit = 'c');
double umrechnung_temperatur( double temperatur, char einheit){}
ergebnis = umrechnung_temperatur(temperatur, einheit);ergebnis = umrechnung_temperatur(temperatur);
Beispiele/_0802_Modul_...
C++ | 06.05.15 Seite 25
Aufbau
Dem Default-Parameter folgen nur weitere Default-Parameter. Default-Parameter stehen am Ende der Parameter-Liste. Wenn der Nutzer keine Angaben für den Default-Parameter
macht, wird der angegebene Standardwert genutzt.
datentyp (fktName typ , char einheit = 'c' ) ;
typ name = wert
C++ | 06.05.15 Seite 26
Überladung von Funktionen
Prototypen haben den gleichen Namen. Verschiedene Funktionen werden mit dem gleichen Namen aufgerufen.
Die Funktionen, die den gleichen Namen besitzen, unterscheiden sich aber in der Parameterliste. Die Anzahl der Parameter und / oder die Datentypen der Parameter sind unterschiedlich.
Der Rückgabewert kann bei Funktionen desselben Namens gleich sein, muss aber nicht.
Der Compiler ruft entsprechend der Parameterliste die Funktionen auf.
C++ | 06.05.15 Seite 27
Prototypen
#ifndef SUMME_H#define SUMME_H
#include <iostream>
using namespace std;
int addition(int, int);float addition(int, int, int);float addition(float, float);
#endif /* SUMME_H */;
Be
isp
iele
/_0
80
3_
Mo
du
l_qu
elle
he
ad
er_
Ue
be
rlad
un
g...
C++ | 06.05.15 Seite 28
Aufruf
int intZahl01 = 1; int intZahl02 = 2; int intZahl03 = 3; float fltZahl01 = 0.5; float fltZahl02 = 1.0;
cout << "\n = " << addition(intZahl01, intZahl02); cout << "\n = " << addition(intZahl01, intZahl02, intZahl03); cout << "\n = " << addition(fltZahl01, fltZahl02);
Be
isp
iele
/_0
80
3_
Mo
du
l_m
ain
...
C++ | 06.05.15 Seite 29
Inline-Funktionen
Der Funktionskörper wird direkt an der Stelle eingefügt, an der die Funktion aufgerufen wird.
Nutzung für sehr kleine Funktion. Inline-Funktionen müssen in jeder Datei definiert werden, in der
sie verwendet werden.
C++ | 06.05.15 Seite 30
Definition
inline bool isLessThen(int lWert, int rWert){ return(lWert < rWert);}
Beispiele/_0804_Modul_quelleheader_Inline...
Der Funktionskopf beginnt mit dem Schlüsselwort inline.
C++ | 06.05.15 Seite 31
Aufruf
void ausgabe(int lWert, int rWert){
if(isLessThen(lWert, rWert)){ cout << lWert << " ist kleiner als " << rWert; } else if(isGreaterThen(lWert, rWert)){ cout << lWert << " ist größer als " << rWert; } else if(isEqualThen(lWert, rWert)){ cout << lWert << " ist gleich dem Wert " << rWert; }}
Be
isp
iele
/_0
80
4_
Mo
du
l_qu
elle
...
C++ | 06.05.15 Seite 32
Namensraum
In welchen Bereich sind die Funktionen sichtbar? Um Namenskonflikte zu vermeiden, werden Quelldateien in
Pakete verpackt. Alle Standardkomponenten der Programmiersprache C++
liegen in dem Namensraum std. std ist der Standard-Namensraum für Objekte, die in der Standardbibliotheken definiert sind.
C++ | 06.05.15 Seite 33
Angabe des Namensraumes
std::cout << "\n int + int = " << addition(intZahl01, intZahl02);
Mit Hilfe des Präfixes std::cout wird der Zugriff auf das Element freigegeben.
Das Element wird nur an dieser Position im Code benötigt.
C++ | 06.05.15 Seite 34
using-Anweisung
using namespace std;
Durch die Anweisung werden alle Namen in dem angegebenen Raum sichtbar.
Der Zugriff auf den angegebenen Namensraum wird für alle Funktionen erlaubt.
using-Anweisungen sollten nicht in Header-Dateien verwendet werden