35
Leibniz Universität IT Services | Anja Aue C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen

C++ - Einführung in die Programmierung · C++ | 06.05.15 Seite 2 Modularisierung Logische Gliederung von Programmteilen mit Hilfe von Namensräumen. Aufteilung von einem sehr großen

  • Upload
    dokien

  • View
    214

  • Download
    1

Embed Size (px)

Citation preview

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

C++ | 06.05.15 Seite 35

using-Deklaration

using std::cout;

Aus dem Namensraum std wird nur der Name cout sichtbar. Alle Funktionen können nur auf das angegebene Objekt in dem

Namensraum zugreifen. Die using-Deklaration kann am Anfang eines Moduls oder

direkt in einem Funktionsrumpf stehen.