C++ - eine Einführung

Werbung
C++ - eine Einführung
Wilfried Elmenreich
Folien basieren auf dem Vortrag
“From Java to C++” von Ulrik Schröder
Inhalt des Vortrags
•
Voraussetzungen
•
Unterschiede C++ / Java
•
C++ Grundkonzepte: Operatoren, Schleifen, I/O
•
Klassenstruktur, Hauptprogramm
•
Entwicklungschritte eines C++ Programms
•
Softwaretipps für die Praxis
Einführung in C++
2
1
Meine Annahmen über Sie…
• Sie kennen bereits die Grundelemente der Programmiersprache Java
aus Einführung in das Programmieren:
- Syntax
- Konzept einer Compilersprache
- Klassen und Objekte
• Möglicherweise kennen Sie auch C
• Sie wollen wissen wie man in C++ programmiert
• Sie wollen wissen was den Unterschied zwischen Java und C++ ausmacht
Einführung in C++
3
Features in C++ welche Java nicht besitzt
•
•
•
•
•
•
•
•
•
•
goto
memory management: malloc, free
structs and unions (Java verwendet hierfür nur classes)
header files (*.h / *.cpp)
global variables, functions (only methods)
preprocessor, typedef and defines (static final)
implicit type conversions
operator overloading
multiple inheritance
(Java verwendet stattdessen interfaces)
templates
Einführung in C++
4
2
Was C++ nicht bietet
•
•
•
•
•
•
•
•
•
•
Standards built-in types, sequence of evaluation, ...
Standard support für GUI programming
– kein AWT, Swing, …
Threads
Networking
Generators for documentation (javadoc)
Reflection
Garbage Collection
Packages
Machine (operating system) - independent object code
– Advantage:
Ad
t
optimized
ti i d machine
hi code
d
– Disadvantage: need compiler per platform and compilation for target
Bibliotheken für oben genannte Funktionen existieren, sind aber nicht Teil der
C++-Sprache oder der STL (Standard template Library), z.B.
– QT
– LEDA
Einführung in C++
5
Hauptunterschiede C++ - Java
• A
Aus Programmierersicht
P
i
i ht
– Memory management
– Pointer
• Aus Anwendersicht
– Keine VM auf dem Zielsystem notwendig (eingebettete
Systeme)
– Mehr Kontrolle, z.B. beim Löschen von Objekten
(bessere Laufzeitabschätzung für Echtzeitsysteme)
– Bessere Performance (immer?)
Einführung in C++
6
3
Performance C++ vs. Java
• Integerarithmetik:
unentschieden
• Floating Point: C++ ca.
30% schneller
• FileIO: C++ ist bis zu 35
mal schneller
• Objekthandling: Java ist
etwa doppelt so schnell
4000
3500
3000
2500
Java
C++
2000
1500
1000
500
0
1
2
3
4
5
Einführung in C++
7
Variablendeklaration und Initialisierung
•
•
•
Variablentypen:
bool char
bool,
char, short
short, (unsigned) int
int, long
long, float
float, double
Klassenvariablen mittels Schlüsselwort static
Variablen müssen mit einem Buchstaben oder mit „_“ beginnen
•
•
Initialisierung innerhalb der Definition möglich
Deklaration ist zwingend vor der ersten Benutzung erforderlich
int i
float
i = i
int j
•
=
x
+
=
3;
= 10.0;
1;
i;
Deklaration von mehreren Variablen eines Typs ist direkt möglich (wie in C)
Beispiel:
int i = 3;
float x=10.0, y=1.23;
Einführung in C++
8
4
Operatoren
• Arithmetische Operatoren: +
• Vergleich <
• Logik !
- * / % pow(x,y)
( ) ++ --
<= > >= == !=
&& ||
–0 entspricht false, ungleich 0 ist true
• Bit Operatoren
~ & ^ | << >>
–Shift-Operatoren lassen Vorzeichen unbeeinflusst
Einführung in C++
9
Zuweisungsoperatoren
• Zuweisungsoperatoren wie in C
x
x
x
x
x
x
x
= y
+= y, x -= y
*= y, x/= y
%= y
>>= n, x <<= n
&= y, x |= y
^= y
• ermöglicht kompakten Code
Einführung in C++
10
5
if else Ausdruck
if (Bedingung)
// Anweisung oder Block von Anweisungen
else
// Anweisung oder Block von Anweisungen
• else-Teil optional
• Bedingung kann ein beliebiger Ausdruck sein der einen
numerischen Wert ergibt
• Klammern sinnvoll um Fehlerquellen zu vermeiden
• Vorsicht vor Seiteneffekten in Bedingung
Einführung in C++
11
Schleifen
• while Schleife
while (Bedingung)
// Anweisung oder Block von Anweisungen
• do-while Schleife
do
// Anweisung oder Block von Anweisungen
while (Bedingung)
auf jeden Fall 1 Durchlauf
• for Schleife
for (init-statement; test-expr; increment-expr)
// Anweisung oder Block von Anweisungen
• break springt aus der aktuellen (innersten) Schleife
• continue springt in die nächste Iteration
Einführung in C++
12
6
Arrays
• Sammlung von Elementen des gleichen Typs
• Deklaration
float x[100];
• Abrufen der Elemente
x[0];
x[99];
// erstes Element
// letzes Element
• Initialisierung
float x[3] = {1.1, 2.2, 3.3};
float Y[] = {1
{1.1,
1 1
1.2,
2 1
1.3};
3};
• Mehrdimensionale Arrays
float x[4][4];
int m[2][3] = {
// Matrix
{1, 2, 3}
{4, 5, 6} };
Einführung in C++
13
Einbindung von Programmbibliotheken
• Einbinden von Programmbibliotheken über #include
<headerfile>
eines Wertes in
in Grad
Grad und Ausgabe
Ausgabe der
der Sinusfunktion
Sinusfunktion
• Beispiel: // Einlesen eines
#include
#include <iostream.h>
<iostream.h>
#include
#include <math.h>
<math.h>
int
int main() {
float
float angle;
angle;
cin >> angle;
//// Winkel
Winkel einlesen
einlesen
cout
cout << sin(angle
sin(angle * M_PI
M_PI / 180.0
180.0 )) <<
<< endl;
//// M_PI
M_PI ist
ist in <math.h> definiert
definiert
return
return 0;
0; }}
• Innerhalb von cout << können Funktionen benutzt werden
• Liste der verfügbaren Funktionen in math.h
Einführung in C++
14
7
Klassen und Objekte
• Grundstruktur einer Klassendefinition
class
class Klassenname
Klassenname
{{
eineFunktion(..);
eineFunktion(..);
public:
public:
Klassenname(...);
Klassenname(...); //// Konstruktor
Konstruktor
~Klassenname();
~Klassenname();
//// Destruktor
Destruktor
};
};
• Schlüsselwörter public, private, protected steuern Zugriff von außerhalb
• Konstruktoren (bzw. Destruktoren) gibt es immer, aber man kodiert sie oft
nicht explizit
• Konstruktoren werden beim Erstellen eines Objektes dieser Klasse
aufgerufen
Klassenname k1(1,2);
Einführung in C++
15
Hauptprogramm
•Nötig für alle Programme (wie in C)
•Einfachstes Bespiel:
int
int main()
main()
//// Funktion
Funktion fürs
fürs OS (ohne
(ohne Argument)
Argument)
{
//// Anfang
Anfang der
der Funktion
Funktion
return
return 0;
0;
}
//// Rückmeldung ans OS
OS (OK)
(OK)
//// Ende
Ende der
der Funktion
Funktion
•Dateierweiterung: .C, .cc oder .cpp
•Beispiel mit Ein/Ausgabe
## include
include <iostream.h>
int
int main()
main() {
//// Variablendefinition
Variablendefinition
float
float a,
a, b,
b, c;
c;
//// Eingabe
Eingabe
cin
cin >> a >> bb >>
>> cc ;
//// Ausgabe
Ausgabe
cout
cout << aa <<
<< “,
“, ”” << bb << “,
“, ” << c << endl;
return
return 0;
0;
}}
Einführung in C++
16
8
I/O in C++
• generic output stream wird mit << operator angesprochen
• cout ist in <iostream> im Namespace std deklariert
#include <iostream>
using namespace std;
...
std::cout << ...
int main( ) {
cout << "Hello!";
} // main( )
Deklarationen der
Standardlibrary haben
immer den namespace std!
Einführung in C++
17
I/O Klassenhierarchie
• istream und ostream von ios abgeleitet
• iostream mittels Mehrfachvererbung von istream und ostream
abgeleitet
ios
istream
ostream
iostream
cout
cin
cerr
Einführung in C++
clog
18
9
I/O Formatierung - Zahlenbasis
#include
#include <iostream>
<iostream>
int
int main(
main(( )) {{ int
int c;
c;
cout
cout <<
<< "Please
"Please enter an integer value for variable
variable c:\n c = ";
cin
cin >>
>> c;
c;
cout
cout <<
<< "\toctal\tdecimal\thexadecimal\n"
"\toctal\tdecimal\thexadecimal\n"
<<
"\t0_"
<< "\t0_" <<
<< oct
oct <<
<< cc
<<
<<
<< "\t"
"\t"
<< dec
dec <<
<< cc
<<
\t0x
<<
<< "\t0x"
"\t0x"
<< hex
hex <<
<< cc <<
<< endl;
endl;
return
return 0; // "normal" end
end of
of execution
execution
}} //
// main(
main( ))
Einführung in C++
19
I/O Formatierung - Fließkommazahlen
cout
42
cout
ut <<
<< 42.12345678
42 12345678
42.12345678
12345678 <<
<< endl;
endl;
ndl;
42 1235
42.1235
cout.precision(
cout.precision( 4
4 );
);
cout
cout <<
<< "precision:
"precision: "" <<
<< cout.precision(
cout.precision( )) <<
<< endl;
endl;
precision: 4
cout
cout <<
<< 42.12345678
42.12345678 <<
<< endl;
endl;
42.12
cout.setf(ios::fixed);
cout
cout.setf(ios::fixed);
t setf(ios::fixed);
tf(i
fi d)
cout
cout <<
<< "fixed:
"fixed: "" <<
<< 42.12345678
42.12345678 <<
<< endl;
Einführung in C++
42.1234
20
10
I/O Formatierung – iomanip
#include <iomanip>
Definiert wird
• Breite des Ausgabefeldes für das folgende Argument
• Ausrichtung
• Füllzeichen
cout
cout <<
<< '|'
'|' <<
<< setw(
setw( 10
10 )) <<"xxx"
<<"xxx" <<'|'
<<'|' <<
<< endl;
endl;
|
xxx|
cout
cout <<
<< '|'
'|' <<
<< setw(
setw( 10
10 )) <<
<< setfill('*')<<"xxx"
setfill('*')<<"xxx" <<'|' << endl; |*******xxx|
cout <<
<< '|'
'|' <<
<< setw(
setw( 10 )) <<
<< left
left <<"xxx"
<<"xxx" <<'|'
<<'|' <<
<< endl;
|xxx*******|
cout <<
<< '|'
'|' <<
<< setw(
setw( 10 )) <<
<< internal
internal <<"xxx" <<'|'
<<'|' <<
<< endl;
endl;
|****xxx***|
cout <<
<< '|'
'|' <<
<< setw(
setw( 10
10 )) <<
<< right
right <<"xxx"
<<"xxx" <<'|'
<<'|' <<
<< endl;
endl;
|*******xxx|
Einführung in C++
21
Formatierte Eingabe
• Operatoren analog zu jenen bei der formatierten Ausgabe:
/* formatted input
/
/
input */
*/
int
int i;i; double
double x;
x;
cout
cout <<
<< "Enter
"Enter a hex
hex value:
value: ";
";
cin >> hex >> i;i;
ab
cout <<
<< "i
"i == "" << ii << "" == 0x"
0x" <<
<< hex
hex <<
<< i <<
<< endl;
endl;
coutt <<
";
<< "Enter
"E
"Enter
t aa floating
floating
fl ti point
point
i t value:
value:
l
"";
i = 171 = 0xab
cin >>
>> x;
x;
123
123.456
cout <<
<< "x
"x == "" << xx <<
<< endl;
endl;
123456e-3
x=123.456000
Einführung in C++
22
11
Java Entwicklungsschritte
Editor
$$javac
javacClassName.java
ClassName.java
Java-Program
Compiler
$$java
javaClassName
ClassName
Library
classes
Bytecode
Bytecode
Bytecode
Bytecode
Java Virtual
Machine (JVM)
ClassName.java
e.g. Win
e.g. Mac, Unix, Handy OS, ...
ClassName.class
via Internet
Einführung in C++
23
C++ Entwicklungsschritte
Analyze,
Analyze,check
check
consistency,
consistency,
generate
generatecode
code
Editor
$$ gcc
gcc –c
–c –Wall *.cpp
*.cpp
in DevC++
main.exe
C++ source
Compiler
Link
Linkfurther
further
classes
classes
$ gcc
gcc –o
–o main.exe
main.exe *.o
Object code
Linker
executable
ClassName.cpp
ClassName.h
Processor
libraries
ClassName.o
Object code
Object code
Object code
Object code
Non-standard !
execute,
execute,test,
test,
debug
debug
Platform-dependent !
Einführung in C++
$ ./main.exe
./main.exe arg1
arg1 …
24
12
C++ Programmierzyklus
iterative
yedit – compile – link – run (test,debug) – cycle
Editor
Compiler
Linker
*.h
*.h
*.cpp
*.cpp
*.o
*.o
*.h
*.h
*.cpp
*.cpp
*.o
*.o
*.h
*.h
*.cpp
*.cpp
*.o
*.o
*.h
*.h
*.cpp
*.cpp
*.o
*.o
make
*.exe
*.exe
declarations
test
test cases
cases
definitions
Object
Object files
files in
in
libraries
libraries
*.h
*.h
Can also include global data and functions!
Einführung in C++
25
Trennung Deklaration & Definition
• Deklaration (Struktur) in .h-Datei (Headerfile)
• Definition (Implementierung)
(Implementier ng) in .cpp-Datei
cpp Datei
• Bsp.:
Association to class
point.cpp
#include “point.h“
returns new point
point point::add( point v ) {
Object
return point( x + v.x, y + v.y );
} // point::add( )
Class based visibility (like Java)
#ifndef __POINT_H__
#define __POINT_H__
Prevent multiple
declarations
class point {
StdConstructor
StdConstructor point(
point( ))
default values
private:
==
== point(
point( 00 )) ==
== point(
point( 0,
0, 00 ))
for arguments
double x, y;
public:
point( double a=0, double b=0): x( a ), y( b ) { };
point add( point v );
}; // class point
initialize
#endif __POINT_H__ Einführung in C++
attributes
26
13
Beispielprojekt mit Modul point
• Inkludieren des Headerfiles
instead of Java
toString( ) method
point.cpp
#include "point.h"
point point::add( point v ) { return point( x + v.x, y + v.y
); }
could have also been
void point::print( ) { cout << "(" << x << "|" << y << ")"; }
int main ( ) {
main.cpp
point
i u(( 1.0
1 0 )), v(( -0.5,
05 4
4.2
2 )), w;
w = u.add( v );
cout << "u = "; u.print( ); cout << endl;
cout << "v = "; v.print( ); cout << endl;
cout << "w = "; w.print( ); cout << endl;
return 0;
} // main( )
Einführung in C++
defined in point.cpp
object
bj t creation
ti without
ith t
new using three
different constructors
uu == (1|0)
(1|0)
vv == (-0.5|4.2)
(-0.5|4.2)
ww == (0.5|4.2)
(0.5|4.2)
27
Kompilieren und Linken
• Jedes Modul separat kompilieren
$ g++ –c –Wall –pedantic-error -ansi point.cpp
point.o
$ g++ –c –Wall –pedantic-error -ansi main.cpp
main.o
• Objektdateien linken
$ gcc –o main main.o point.o
main[.exe]
• Ausführen des Programms – endlich!
$ ./main
Einführung in C++
28
14
Auf ins Gefecht - womit
• Gnu Compiler unter Linux/Unix oder cygwin: www.cygwin.org
• Dev C++ g
grafische Oberfläche für Windows: www.bloodshed.net
• oder Eclipse: www.eclipse.org
aber
• Beispielabgabe muss korrekt auf dem System der Übung laufen!
Einführung in C++
29
Danke für die Aufmerksamkeit!
Fragen, Kommentare, Wünsche?
Einführung in C++
30
15
Herunterladen