C++ Einführung

Werbung
K03
C++Einführung
1.
2.
3.
4.
5.
6.
Allgemeines
Entwicklungsprozess
GültigkeitsbereicheundNamespaces
Prozedur-/Funktionsaufrufe,Inlining,
Default-Argumente
ElementareTypenundStrukturen
VergleichJava/C++
nachFolienvonHeikoSchuldt
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
2
C++Literatur
n
n
n
B.Stroustrup:DieC++Programmiersprache.4.Auflage
Addison-Wesley,2010.ISBN:3827328233
B.Stroustrup:EinführungindieProgrammierungmitC++
Pearson,2010.ISBN: 978-3-8689-4005-3
M.Weiss:C++for JavaProgrammers
PearsonPrentice Hall,2004.ISBN:013919424X
Freiverfügbar:
n
B.Eckel:Thinking inC++,SecondEdition.
VolumeI/II.Prentice Hall.2000/2003
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
3
Abschreckend– Neugierigmachend?
“C++ is a horrible language. It's made more horrible by the
fact that a lot of substandard programmers use it, to the
point where it's much much easier to generate total and utter
crap with it. Quite frankly, even if the choice of C were to do
*nothing* but keep the C++ programmers out, that in itself
would be a huge reason to use C.”*
*LinusTorvaldsüber C++im Vergleich zu C,im Kontext vonGit:
http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
4
WarumC++?
n
Effizientesystemnahe(maschinennahe)Programmierung
n
n
n
WirddarüberhinausinunterschiedlichstenAnwendungsgebietenbenutzt,
z.B.:
n
n
n
n
n
Graphik,2D&3DVisualisierung
NumerischeBerechnungen
Server-Anwendungen
Spieleprogrammierung
HoherVerbreitungsgrad
n
n
Betriebssysteme
EingebetteteSysteme
Esexistierensehrviele(freie)Bibliotheken
C++kannauchmitanderenProgrammiersprachengekoppeltwerdenwie
z.B.VisualBasic,Python,MATLAB,Java,Haskell …
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
5
WannC++ehernicht?
n
UmalsAnfänger„malschnell“diex-teSoftwarezurVerwaltung
derprivatenMusiksammlungzuentwickeln
à EinederkomplexestenProgrammiersprachen.
n
KleineProjekte
n
Skripte
n
SchnellePrototypenentwicklung
n
ErhöhteSicherheitsanforderungen– StichwortSandboxing
n BedingtdurchdieMöglichkeitdirektaufdenSpeicherzugreifen
zukönnen,ohnedasdiesüberwachtwird*,istesleichtmöglich
denSpeicherzukorrumpierenoderkompromittierbarenCode
zuschreiben,dereserlaubtSchadfunktioneinzuschleusen.
*WasaberandererseitsheutigeBetriebssystemezumindestimUserspace einschränkendurch
disjunkteSpeicherbereicheproProzess.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
6
C++zusammengefasst
C
n
C++istnicht C,obwohlbeidevielesgemeinhaben
n
n
n
n
n
n
n
n
n
Kapselung,Polymorphie,Mehrfachvererbung(!)
UnterscheidungzwischenObjektidentitätundObjektgleichheit
BietetMöglichkeitenderfunktionalenProgrammierung
n
n
SeparateQuellcode-Dateien,Namensbereiche,Klassen,Funktionen/Methoden
Imperativ,systemnah
Objektorientiert
n
n
Inkompatibilitätenz.B.durchstrengereTypprüfunginC++
Strengtypisiert
DynamischesalsauchstatischesBinden
Modular– StrukturierungdesQuellcodesdurch:
n
n
C++
Methoden/FunktionenhöhererOrdnungdurchFunktionszeiger
ÜberschreibenvonMethodenundÜberladenvonOperatoren
Ausnahmen(Exceptions)zurFehlerbehandlung
TemplateszurgenerischenProgrammierung
MetaprogrammierungdurchMakros(z.B.bedingtesKompilieren)
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
7
StammbaumderOO-Sprachen
Quelle:http://upload.wikimedia.org/wikipedia/commons/d/db/Historie.png
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
8
SchlüsselwörterinC++undC
SchlüsselwörterinCund C++
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
Schlüsselwörter(nurC++)
Legende: Schwarz
Braun
asm
bool
catch
class
const_cast
delete
dynamic_cast
explicit
false
friend
inline
mutable
namespace
new
operator
private
protected
public
reinterpret_cast
static_cast
template
this
throw
true
try
typeid
typename
using
virtual
wchar_t
Syntax,SemantikähnlichinJava
inderVorlesung(nicht)behandelt
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
9
DasklassischeersteProgramm
hello_world.cpp
// it does what it does
#include <iostream>
int main()
{
std::cout << "hello world!\n";
return 0;
}
> g++ hello_world.cpp -o hello_world
> ./hello_world
hello world!
iostream:benötigtman,umdas
cout (console output)Objektfür
dieAusgabeaufderKonsole
benutzenzukönnen.
std::cout isteinStandardStream-OutputzurAusgabe
g++ istderGNUC++Compiler,
dereineC++Dateikompiliert
undeinExecutable erzeugt.
DasProgrammhello_world
wirdausgeführt
ZumeistwirdeinMakefile benutzt,umdenÜbersetzungsvorgangzuautomatisieren.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
10
Diespeziellemain-Funktion
n
FunktionzumStartendesProgramms– derEinstiegspunkt
n
SagtdemBetriebssystem,woderEinsprungindasProgrammstattfindet
– nureinemain-FunktionproProgrammmöglich.
test.cpp
Funktionsargumentekönnenauch
weggelassenwerden(Überladen),
wennnichtgenutzt.
int main(int argc, char** argv)
{
int x = 0;
return x;
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
11
StandardEin- undAusgabe
n
cout wirdzurAusgabeaufdieKonsolebenutzt:
#include <iostream>
using namespace std;
int main() {
int i = 5;
cout << "the value of i is " << i << endl;
}
n
endof line
cin wirdzurEingabebenutzt:
#include <iostream>
using namespace std;
int main() {
int i;
cout << "Enter a value for i ";
cin >> i;
}
cin wartetaufEingabe
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
12
1 // small example
Kommentare
2 /* A first program in C++ */
Mit/* und*/bzw.durch//.
3 #include <iostream>
4
5 int main()
6 {
7
std::cout << "Welcome ";
8
std::cout << "to C++!\n";
9
return 0; //program ended successfully
10 } // end method main
Präprozessor-Direktiven
Zeilenmit# sindPräprozessorDirektiven,alsoBefehlefürden
C++Präprozessor.
#include <iostream> teiltdem
Präprozessormit,dassderInhalt
derDatei<iostream> mitindie
C++Dateieingebundenwerden
soll.
Welcometo C++!
return isteineMöglichkeit,eineFunktionzubeenden.
return 0 teiltdemVater-Prozessmit,dassdasProgrammerfolgreichbeendetwordenist.
§ Exkurs:Programmkannauchdurchexit(int) jederzeitbeendetwerden
§ Bekommtmandurch#include <stdlib.h>
§ Signatur(Prototyp)istvoid exit(int);
§ ParameteristRückgabewertfürVater-Prozess(0 =normalexit)
§ Achtung:ruftkeineDestruktoren auf;dazuspätermehr
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
13
FortsetzungBeispiel
n
std::cout
Standard-AusgabeStream-Object
n
“Verbunden”mitderKonsole
std:: istderNamesbereich "namespace"voncout
std:: kanndurchusing std weggelassenwerden
n
n
<<
Stream-AusgabeOperator
WertaufderrechtenSeitedesOperatorwirddemOutput-Streamübergeben
(welchermitderKonsoleverbundenist)
std::cout << "Welcome to C++!\n";
n
n
n
n
>>
n
n
n
Stream-EingabeOperator
ZeichendesInput-StreamwerdenderrechtenSeitedesOperatorszugewiesen
\
n
n
„Escape character“
BesondereZeichenzurAusgabe
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
K03
C++Einführung
1.
2.
3.
4.
5.
6.
Allgemeines
Entwicklungsprozess
GültigkeitsbereicheundNamespaces
Prozedur-/Funktionsaufrufe,Inlining,
Default-Argumente
ElementareTypenundStrukturen
VergleichJava/C++
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
15
EntwicklungmitmehrerenDateien
n
InC++istesüblich,denQuelltextinmehrerenDateienzuhalten
n
GruppierunglogischzusammengehörenderFunktionen/Klassen/Strukturen
n
JedeDateibildetdadurcheinModul
n
DateinameundInhaltderDateisindfürdenCompilerzusammenhangslos(im
Gegensatzzuz.B.Java);esistaberüblichdassderNamedenInhaltin
sinnvollerWeiserepräsentiert.
main.cpp
utils.cpp
int add(int a, int b);
int add(int a, int b) {
return a + b;
}
int main(void) {
int result, a=2, b=3;
std::cout << add(a,b);
return 0;
}
int sub(int a, int b) {
return a - b;
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
16
OrganisationdesQuellcodes(i)
#include <iostream>
#include "Body.h"
int main()
{
Body a;
std::cout<<a.volume()<<std::endl;
return 0;
}
Deklaration in
WasistBody ?
WasistBody::volume() ?
test.cpp:Hauptprogramm,dasdieKlasseBody
benutzt.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
17
OrganisationdesQuellcodes(ii)
#include <iostream>
#include "Body.h"
int main()
{
Body a;
std::cout<<a.volume()<<std::endl;
return 0;
}
test.cpp:Hauptprogramm,dasdieKlasseBody
benutzt.
class Body
{
public:
int volume() const;
...
};
Body.h:HeaderDateiinderdie
Klassen/Funktionendeklariert
werden.
#include "Body.h"
int Body::volume() const
{
return int k = 1;
}
...
Body.cpp:Implementierung
(=Definition)derKlasse/Funktionen.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
18
DeklarationversusDefinition
DeklarationenundDefinitionensindzweiunterschiedlicheKonzepte!
n
AlleBezeichner(Symbole)müssendemCompilerbekanntgemachtwerden, d.h.
siemüssenvordererstenVerwendungdeklariert werden.
Deklaration
n
BekanntgabeanCompilerüberExistenzz.B.einerFunktion,einerKlasseusw.
n
BeiFunktionliefertsiedieSignatur:Rückgabetyp,ListederArgumente.
n
DeklarationeinerFunktionwirdauchalsFunktionsprototypbezeichnet.
Definition
n
Variable:HierwirdvomCompilerCodeerzeugt,derfürsieSpeicherreserviert.
n
Klasse/Funktion:derenImplementierung.
Beachte: JedeDefinitioneinerVariablenistaucheineDeklaration.
DeklarationundVerwendungohneDefinitionführtzuLinker-Fehler.
Mehrfachdeklarationsindmöglich;Mehrfachdefinitionjedochnicht.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
19
Funktionsdeklaration
AufbauderDeklaration– Funktionsprototyp
T0
F ( T1 [P1], T2 [P2], … ) ;
T0
= TypdesFunktions-Rückgabewertes
F
= Name(Bezeichner)derFunktion
Pi
= FormaleParameter(VariableninnerhalbderFunktion)
Ti
= TypenderformalenParameter
Beispiele:
int foo(int x);
int foo1 ( int, float );
void bar();
float evalSquare (float a0, float a1, float a2, float a3);
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
20
Funktionsdefinition
SyntaxderDefinition
T0
F ( T1 P1 , T2 P2 , … )
{
. . .
}
n
Innerhalb{
n
FormaleParameterwerdenwieandereVariableninnerhalbdesBodysverwendet
n
return x beendetFunktionundgibtFunktionswertvomTypT0 zurück
n
} stehendieAnweisungenund/oderAusdrücke(function body)
FallsT0 = void,verwendetmanreturn ohneArgument
(nichtnötig,fallsreturn unmittelbarvor } )
Beispiel:
bool sign(int x)
{
if ( x >= 0)
return true;
else
return false;
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
21
Beispiel
#include <iostream>
#include "Body.h"
//declaration and definition
int global = 0;
int main()
{
Body a; //definition
int i=1, j; //defini (i), declar (j)
l = func1(i,k);
l = func2(i,k);
std::cout<<a.volume()<<std::endl;
return 0;
}
test.cpp:Hauptprogramm,das
dieKlasseBodybenutzt
Body.h
int func1(int, int); //declaration
int func2(int k, int j); //declaration
class Body {
public:
int volume();
};
Body.cpp
#include "Body.h"
//definition
int Body::volume()
{
int MAX=10;
//declar + defini
return MAX;
}
//definition
int func1(int k, int j) {
return (k-j);
}
//definition
int func2(int k, int j) {
return (j+k);
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
23
KompilierenundLinken- Stufen
PreprocessorC++CompilerLinker
Body.h
Body.cpp
Body.h'
Executable
(ausführbares
Programm)
Body.o
Body.cpp'
test.o
test.cpp
Library.h
Library.h
Library.h
test.cpp'
Library
Library
Library
Souce-Codenotwendig
wennstatischbeim
Kompiliereneingebunden.
Object-Codenotwendig
wennstatischbeim
Linkeneingebunden.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
24
Präprozessor
n
WertetMakros bzw.Direktiven aus:
n
n
n
n
EinMakro/Direktive*isteineAnweisunganeinenSoftwareprozessor;
z.B.Textersetzungmittels#include-AnweisungdurchPräprozessor.
n MakroskönnenArgumentehaben;hiernichtbehandelt.
HauptanwendungsgebietvonMakrosistdasbedingteKompilieren:
n Plattformunabhängigkeit:plattformspezifischerCodewirdnurdann
eingefügt,wenntatsächlichfürdiebetreffendePlattformkompiliert
wird(ansonstennicht).
„Versteht“selbstkeinC++(bzw.C).
DererzeugteC++QuelltextwirdandenCompilerübergeben.
Merke:
Makros/DirektivensindAnwendungsfälleder
Meta-Programmierung – „ProgrammimProgramm“
*EsexistierenauchDirektiven,welcheAnweisungenandenCompileroderLinkersind.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
25
Präprozessor-Anweisung– Beispiel
n
FürdieArbeitmitmehrerenDateienwirdmeisteszujederHeaderDateidiefolgendeAnweisunghinzugefügt:
#ifndef FILENAME_H
#define FILENAME_H
<header file body here>
#endif /* FILENAME_H */
n
Damitwirdgewährleistet,
dasseineHeader-Dateimax.
einmalbeimKompilieren
eingebundenwird.
#ifndef BODY_H
#define BODY_H
int func1(int, int);//declaration
int func2(int k,int j);//declaration
const int MAX=10; //decla + defini.
class Body {
public:
int volume();
};
#endif /* BODY_H */
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
27
Mehrfach-EinbindungvonHeadern
#ifndef _BASIS_H_
#def _BASIS_H_
// content of basis.h
int global=100;
int volume() {return global++; }
#endif
Header-Datei:
basis.h
Header-Datei:graphen.h:
Header-Datei:statist.h:
#include <iostream>
#include "basis.h"
#include <iostream>
#include "basis.h"
#include "statist.h"
#include "graphen.h"
int main()
{
. . .
return 0;
}
Quelldatei:
anwendung.cpp
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
28
Compiler
n
n
n
n
n
ErwartetC++(bzw.C)-Quelltextohne
Präprozessoranweisungen
ÜberprüftSyntax
Generiert undoptimiert Maschine-Code
ErzeugtObjekt-Datei(en)fürdenLinker
DieQuelltext-DateienundZeilennummernsindimmernoch
bekannt
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
29
Objekt-Dateien
n
Objekt-DateienenthaltendenkompiliertenQuelltextund
einenIndexderbenutztenSymbole(Bezeichner).
n
nm (Linux)oderdumpbin (Windows)erzeugtdieseIndexliste.
n
SymbolesindnochkeinenAdressenzugeordnet.
n
EndungeinerObjekt-Datei:.o (Linux)bzw..obj (Windows)
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
30
Linker(Binder)
n
Linker
n
n
LöstalleAbhängigkeitenderObjekt-Dateienauf.
ErzeugtdasausführbareProgramm
n
n
n
n
Dazumüssenu.a.SymbolenAdressenzugeordnetwerden
MachtkeineweitereCode-Optimierung
KenntkeineTypenoderVariablenmehr
AuflösungdesNamensistabhängigvomCompiler— es
istalsonichtgarantiert,dasseinLinkerObjektdateienvon
unterschiedlichenCompilernlinken(binden)kann.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
31
StatischesversusdynamischesLinken
n
Statisches Linken:AlleObjektdateienwerdenindas
ausführbareProgrammgelinkt.
n
n
DerLinkersuchtinallenObjekt-Dateiennachentsprechenden
SymbolenundführteineZuweisungzwischendefiniertenSymbolen
durch.
Dynamisches Linken:EsgibtSymboledieerstzurLaufzeit
aufgelöstunddynamischgelinktwerdenausBibliotheken.
n
n
n
.dll (Windows)und.so (Linux)Bibliotheken,dieausObjekt-Dateien
bestehenundzurLaufzeitvomBetriebssystemeingebundenwerden
Vorteile:ReduziertGrössevonausführbarenDateien;Fehlerin
BibliothekerfordernnurerneutesKompilierenderBibliothek.
Nachteil:„DLLHell“– WennneuereVersioneinerBibliothek
inkompatibelistmitProgrammdasvonältererVersionabhängt.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
32
Bibliotheken(Libraries)
n
Idee:bereitssorgfältigimplementierteSoftwarewiederverwenden
n
Library:
n
n
n
System-Library:
n
n
n
MengevonvorkompiliertenSourcen (Funktionen,Klassen,Typen,…),
zusammengefasstineinerDatei
IstkeineigenständiglauffähigesProgramm(enthältkeinmain)
Library,dieinbestimmten,vordefiniertenVerzeichnisseninstalliertist
KommttypischerweisemitdemBetriebssystem
Linux:/usr/lib
EinguterProgrammiererkenntvieleunddie„richtigen“Libraries...
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
33
Bibliotheken(Libraries)
n
WieverwendetmanSystem-Libraries?
n
n
n
InderC++Datei:Header-Dateiinkludieren
Beispiel:#include <math.h>
LinkeneinerübersetzenBibliothek(Objektdatei)
n
n
KonventionunterLinux:
-lm linktlibm.so
BeispielMath-Librarylinken:
g++ -o myprog file1.o file2.o –lm
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
34
Makefile
n
n
DerProzessdesKompilierenswirddurcheinMakefile automatisiert.
EinMakefile führteineListederAbhängigkeiten dereinzelnenQuelltextDateienundliefertDirektivenundBefehlezumautomatischen
KompilierendesProjektes.
Body.o: Body.cpp, Body.h
g++ -c -o Body.o Body.cpp
test_body.o: test_body.cpp, Body.h, iostream
g++ -c -o test_body.o test_body.cpp
test: test.o, Body.o
g++ -o test test.o Body.o
n
Abhängigkeiten
Compile Befehl
Abhängigkeiten
Compile Befehl
Abhängigkeiten
Link Befehl
DasErstellenunddasVerwaltenvonMakefiles kannsehraufwändig
sein.EsgibtWerkzeugezumautomatischenErzeugenvonMakefile:
n
Tmake,QMake,CMake,SCons
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
35
TMake
TMake istfreiverfügbarunter:
http://tmake.sourceforge.net/
“tocreateandmaintainmakefiles forsoftwareprojects.It
canbeapainfultasktomanagemakefiles manually,
especiallyifyoudevelopformorethanoneplatformoruse
morethanonecompiler.tmake automatesandstreamlines
thisprocessandletsyouspendyourvaluabletimeonwriting
code,notmakefiles.”
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
36
TMake - Beispiel
test_body.pro
HEADERS
SOURCES
TARGET
=
=
=
Body.h
Body.cpp hello.cpp
test_body
>: setenv TMAKEPATH /local/tmake/lib/linux-g++
>: setenv PATH $PATH:/local/tmake/bin
>: tmake test_body.pro -o Makefile
>: make
g++ -c -pipe -Wall -W -O2
-o Body.o Body.cpp
g++ -c -pipe -Wall -W -O2
-o hello.o hello.cpp
rm -f test_body
g++ -o test_body Body.o hello.o
>: make clean
rm -f Body.o hello.o
test_body
rm -f core *~
n
TMake:
n
n
GeneriertautomatischeinMakefile.
DieAnhängigkeitenzwischendenDateienwerdenautomatischerkannt.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
37
DokumentationdesC++Codes
n
DasVerwaltenundModifizierenvongrossenC++Paketen
kannsehrkomplexsein.
n
n
GuteDokumentationistdeshalbsehrwichtig.
Doxygen isteinWerkzeugzurDokumentationvonC++
QuelltextenvergleichbarzuJavadoc.
n
Doxygen istfreiverfügbarunter
http://www.doxygen.org
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
38
Doxygen
Beispiel:DokumentationeinerFunktion
/**
*
*
*
*
*
*
*
*/
Dokumentation of a function
@param lower
lower bound of the range
@param upper
upper bound of the range
@return
A vector with the same size as this
vector and binary elements
@warning
some detail ..
@todo
...
@bug
...
FVector findInRange(float lower, float upper) const;
Doxygen analysiertdieC++Dateienunderzeugthtml-Dateienmitder
entsprechendenDokumentation.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
K03
C++Einführung
1.
2.
3.
4.
5.
6.
Allgemeines
Entwicklungsprozess
GültigkeitsbereicheundNamespaces
Prozedur-/Funktionsaufrufe,Inlining,
Default-Argumente
ElementareTypenundStrukturen
VergleichJava/C++
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
40
GültigkeitsbereicheinC++
n
C++(undvieleandereProgrammiersprachen)benutzenlexikalischen
Scope.EinScopewirdu.A.durcheinenBlockgebildet.
n
EinBlockisteinPaar,bestehendaus`{´ und`}´.
n
Blöckekönnenbeliebigtiefverschachteltsein.
n
n
n
Syntaxregelndefinieren,anwelchenStellenimProgrammBlöckegebildet
werdenkönnen.
Bezeichner,dieinnerhalbeinesBlocksdeklariertsind,heissenlokal.
Bezeichner,dieausserhalballerBlöckeundFunktionendefiniertsind,
heissenglobal.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
41
GlobaleSichtbarkeit
n
Globale BezeichnersindineinemBlocksichtbar(z.B.ineiner
Funktion),wenn:
n
n
n
n
dieDeklarationvorderFunktionoderdemBlockliegt,
derBezeichnerandersheisstalsdieimBlock,
beieinerFunktionalleParameterderFunktion
andersheissenalsderBezeichner,
allelokalenBezeichner(Variablen,Typen,etc..)
andersbenanntsind.
stack
free
n
GlobaleVariablenliegenim
globalenSegment.
heap
global
text
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
42
LokaleSichtbarkeit
n
Bezeichner,dieineinemBlock(geschachteltenBlock)
deklariertwerden,sindsichtbar:
n
n
n
nurinnerhalbdiesesBlocks,abderStellederDeklarationbiszumEnde
desBlocks
vonBlöcken,welcheindiesenBlockgeschachteltsind,fallssienicht
selbsteinenBezeichnermitgleichemNamedeklarieren.
DieSichtbarkeiteinerFunktionentsprichtder
einesBezeichnersausserhalballerBlöcke
(FunktionenkönneninC++nichtgeschachteltwerden)
n
LokaleVariablenliegenaufdemStack.
stack
free
heap
global
text
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
43
GlobaleVariablen
n
n
n
GlobaleVariablenkönnenvonjedemOrtauserreichtwerden,
auchwennsiedurchlokaleBezeichner„verdeckt“sind.
DerzugehörigeOperator:: heißtBereichsoperator
(engl.scope resolution operator)
GlobaleVariablensolltenmöglichstvermiedenwerden!
n
n
n
Seiteneffekte sindmöglich,wenndieVariableninverschiedenen
Funktionenverwendetwerden.
GlobaleVariablensindinderRegelschlechtzuwarten.
IhreInitialisierung– Reihenfolge – istnichteindeutig.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
44
Sichtbarkeit:Beispiel
int x = 10;
// Globale Variable
void f () {
//
//
//
//
int y = x;
int x = y - 10;
::x = ::x – 9;
{
int y = x;
int x = 5;
Funktionsblock
Benutze globales x
Lege lokales x an
Benutze globales x
// verschachtelter Block
// Welchen Wert hat y?
// Wie oft wird diese Schleife durchlaufen?
for (int j = 0; j < ::x; ++j) { /* ... */ }
}
x = x * 100;
// Welches x wird hier verändert?
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
45
ProblembeiderVerwendungglobalerVariablen…
§ WiesowirdsichderCompiler(beimÜbersetzen)mit
gcc –Wall util.cpp test.cpp -o test darüberbeschweren?
/* util.cpp */
#include <iostream>
using namespace std;
/* test.cpp */
#include <iostream>
using namespace std;
int g_numCalls = 0;
void someFunc(void);
int g_numCalls = 10;
void someFunc(void)
{
cout << "someFunc:util "
<< g_numCalls++
<< endl;;
}
int main(void)
{
cout << "someFunc:main "
<< g_numCalls
<< endl;
someFunc();
someFunc();
}
§ BeimLinkentrittzweimaldiegleicheglobaleVariableauf!
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
46
SpeicherklassevonObjekten
n
n
n
DieDeklarationeinesObjekteslegtnebenTypundName
auchseineSpeicherklassefest.
DiesebestimmtdieLebensdauer.
DieSpeicherklasseeinesObjektesistfestgelegtdurch:
1.
2.
DiePositionderDeklarationinnerhalbderQuelldatei
DieoptionaleSpeicherklassen-Spezifikation:
n
extern/static siehespäter
n
auto
(Default)beimErreicheneinerDefinitionwirddas
ObjektaufdemStackneuerzeugtundbeimVerlassen
wiederzerstört(imGegensatzzustatic)
n
register
ZurBeschleunigungderProgrammausführung,
VariablewirdimRegistergehalten
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
47
DerModifier static
n
n
(i)
EinewesentlicheEigenschaftstatischerObjekteistihrestatische
(=permanente)Lebensdauer.
StatischeObjektewerdenimDatensegmenteinesProgrammsgehalten
undnichtaufdemStack
static hathierbeidreiverschiedeneBedeutungen:
1. VoreinerglobalenVariableoderFunktion
static int g_someValue = 0;
static void g_someFunction(void);
n
n
n
WeistdenLinkeran,diesenBezeichnernichtzuexportieren.
BeschränktdieSichtbarkeitdesBezeichnersaufdieDatei.
DerLinkerwirdihnnichtverwenden,umAbhängigkeitenandererDateien
aufzulösen.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
48
DerModifier static
(ii)
2. VoreinerlokalenVariable(ineinerFunktion)
void someFunc(void) {
static int array[4000];
}
PlatziertdieVariablenichtaufdemStack
n
HatdenEffekt,dassdieVariablezwischenwiederholtenAufrufen
ihrenWertbeibehält
à FunktionmitGedächtnis
(ohneaufglobalsichtbareVariablenzurückgreifenzumüssen)
n
Verwendungz.B.umzuvermeiden,dassgrosse Objekteimmer
wiederaufdemStackangelegtwerden.
n
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
49
DerModifier static
(iii)
3. VoreinerKlassenvariable(oderMethode)
später
class Whatever {
private:
static Whatever* instance;
public:
static Whatever* getInstance (void);
}
n
n
n
n
DefiniertglobaleVariable/FunktionfüreineKlasse
AlleInstanzeneinerKlasseteilensichihrestatischeVariablen
Zugriffvonaussen (fallspublic):Class::Member
StatischeMemberfunktionen könnennuraufstatische
Membervariablen zugreifen
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
50
ProblembeiderVerwendungvonglobalenVariablen…
LösungfürdasProblemderMehrfachverwendungglobalerVariablen(Folie45):
/* util.cpp */
#include <iostream>
using namespace std;
int g_numCalls = 0;
void someFunc(void)
{
cout << "someFunc:util "
<< g_numCalls++
<< endl;;
}
gcc -Wall util.cpp test.cpp -o test
Ausgabe:
someFunc:main 10
someFunc:test 10
someFunc:test 11
/* test.cpp */
#include <iostream>
using namespace std;
static int g_numCalls = 10;
static void someFunc(void)
{
cout<<"someFunc:test "
<< g_numCalls++
<< endl;
}
int main(void)
{
cout << "someFunc:main "
<< g_numCalls
<< endl;
someFunc();
someFunc();
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
51
ProblembeiderVerwendungvonglobalenVariablen…
n
static kannhierhelfen,aber:
n
DieVariableng_numCalls ausutil.cpp und
g_numCalls austest.cpp steheninkeiner
Beziehungzueinander(sindsozusagen'privat' per
Datei)
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
52
ProblembeiderVerwendungvonglobalenVariablen…
NochmalszumProblemderMehrfachverwendungglobalerVariablen(Folie45):
/* util.cpp */
#include <iostream>
using namespace std;
int g_numCalls = 0;
void someFunc(void)
{
cout << "someFunc:util "
<< g_numCalls++
<< endl;;
}
gcc -Wall -ansi util.cpp
test.cpp -o test
Ausgabe:
/* test.cpp */
#include <iostream>
using namespace std;
static int g_numCalls = 10;
// declaration of someFunc
void someFunc(void);
int main(void)
{
cout << "someFunc:main "
<< g_numCalls
<< endl;
someFunc();
someFunc();
}
someFunc:main 10
someFunc:util 0
someFunc:util 1
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
53
ProblembeiderVerwendungvonglobalenVariablen…
NochmalszumProblemderMehrfachverwendungglobalerVariablen(Folie45):
/* util.cpp */
#include <iostream>
using namespace std;
/* test.cpp */
#include <iostream>
using namespace std;
int g_numCalls = 0;
extern int g_numCalls;
void someFunc(void);
void someFunc(void)
{
cout << "someFunc:util "
<< g_numCalls++
<< endl;;
}
int main(void)
{
cout << "someFunc:main "
<< g_numCalls
<< endl;
someFunc();
someFunc();
}
gcc -Wall -ansi util.cpp
test.cpp -o test
Ausgabe:
someFunc:main 0
someFunc:util 0
someFunc:util 1
extern:
Variableistirgendwo
globaldefiniert,kann
hieraberbenutztwerden
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
54
GlobaleVariablen:WeiteresBeispiel
n
WaskönntehierProblemeverursachen?
/* debug.h */
int debug_level;
…
/* test.cpp */
#include "debug.h"
…
/* debug.cpp */
/* otherfile.cpp */
#include "debug.h"
…
#include "debug.h"
…
Übersetzungmit:gcc -Wall *.cpp -o test
§
Fehler:derLinkerwirddreimaldiegleicheglobaleVariabledebug_level sehen.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
55
WeiteresBeispiel: Lösungmitstatic?
static beseitigtzwardenCompilerfehler,verursachtabereinneuesProblem!
n
/* debug.h */
static int debug_level;
…
/* test.cpp */
#include "debug.h"
…
/* debug.cpp */
/* otherfile.cpp */
#include "debug.h"
…
#include "debug.h"
…
Übersetzungmit:gcc -Wall *.cpp -o test
§
JedeDateibekommtihreeigeneVersionderVariablendebug_level!
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
56
ExterneBindung
n
Forderung:
n
n
n
n
n
dieVariableint debug_level solleinmal(imHeader)deklariertwerden
dieVariablesollvonverschiedenenDateienausbenutztwerdenkönnen
essollnichtmehrfachPlatzfürdieVariablealloziert werden
DeklarationderVariablenalsextern
Deklaration:
extern int debug_level;
n
DasbedeutetfürdenCompiler:
“irgendwoexistierteineVariabledebug_level vomTypint,
aberderSpeicherdafürliegtnichthier;derLinkerkümmertsich
umdiekorrekteEinbindung!“
n
dieVariablemussdannnatürlicheinmalineinerder.cpp-Dateiendefiniert
(angelegtundinitialisiert)werden
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
57
WeiteresBeispiel: Lösungmitextern
n
KorrekteVariante:dieVariabledebug_level wirdeinmalineinemHeader
alsextern deklariert,imentsprechendenC++-Filedefiniert(imSpeicher
angelegt).
/* debug.h */
extern int debug_level;
…
/* test.cpp */
#include "debug.h"
…
/* debug.cpp */
/* otherfile.cpp */
#include "debug.h"
Int debug_level = 3;
…
#include "debug.h"
…
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
58
Namensbereiche
n
n
n
engl.namespace
BeimEinbindenvonHeader-Dateienwerdendiedarin
deklariertenglobalenBezeichnerindenaktuellen
Programmkontexteingefügt.
DaskannNamenskollisionenführen,wenndieBezeichner
bereitsvergebensind.
DiesistinsbesonderedanneinProblem,wennder
ProgrammiereraufdieNamensgebungkeinenEinflusshat.
n
z.B.beiVerwendungzweierkollidierenderexterner(third-party)
Bibliotheken
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
59
Namensbereiche
n
Lösung:namespace-Mechanismus
n
Syntax:
(ii)
namespace <namespace-Name>
{
// Member-Deklaration bzw. Definition
}
n
NamespaceMemberskönnenVariablen,Typen,Funktionund
andereNamensbereichesein.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
60
ZugriffaufNamensbereich
n
n
n
Membersinnerhalbeinesnamespace werdenwiegewohnt
angesprochen.
VonausserhalbwirddurchdenqualifiziertenNamendes
namespace Memberszugegriffen.
QualifizierterName(engl.fully qualified name)
<namespace-Name>::<Member>
n
Beispiel:
// std ist der Namensbereich der Standard-Bibliothek
std::cout << "some text " << std::endl;
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
61
Dieusing-Anweisung
n
n
n
Eskannsehrlästigwerden,häufigbenutztenamespace
MembersbeijederVerwendungkomplettzuqualifizieren.
InnerhalbeinesGültigkeitsbereicheskanndieusingAnweisungdenZugrifflockern.
Beispiel:
using <namespace-Name>::<Member>;
oder
using <namespace-Name>; // alle Member des Namensbereich
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
62
Namensbereiche:Beispiel
#include <iostream>
namespace MyStruct {
struct Y {
static int x;
};
int Y.x = 13;
}
namespace std {
void newFunction (void) {}
// in namespace von
iostream einfügen.
}
int x = 10;
int main () {
using std::cout;
using std::endl;
NeuerNamensbereichMyStruct
// Zugriff namespace-Struct
MyStruct::Y var1;
// Zugriff benutzen
std::newFunction();
ErweiterungdesNamensbereichesstd
// Öffne neuen Gültigkeitsber.
{
double x = 3.1415;
cout << x;
cout << ::x;
// -> Pi
// -> 10
}
cout << MyStruct::Y.x << endl;
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
K03
C++Einführung
1.
2.
3.
4.
5.
6.
Allgemeines
Entwicklungsprozess
GültigkeitsbereicheundNamespaces
Prozedur-/Funktionsaufrufe,Inlining,
Default-Argumente
ElementareTypenundStrukturen
VergleichJava/C++
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
64
WaspassiertbeiFunktionsaufrufen?
int min(int a, int b)
{
if (a < b) return a;
return b;
}
1.
2.
ParameteraufdemStack
ablegen,inkl.Platzfür
Rückgabewert,fallsvorhanden.
Rücksprungadresseaufdem
Stack ablegen.
top
int main()
{
int a = 42;
int b = 137;
// addr1
std::cout << min(a, b) << endl;
return 0;
}
t-2
addr1
retur
n a
t-3
b
t-1
3.
4.
5.
6.
7.
SprungzurFunktionmin.
Funktionausführen.
RücksprunghinterdenAufruf.
ParametervomStack nehmen.
NächsteAnweisung.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
65
Inline-FunktioneninC++
inline int min(int a, int b)
{
if(a < b) return a;
return b;
// (a < b ? a : b)
}
int main()
{
int a = 42;
int b = 137;
HäufigeAufrufevon„kleinen“Funktionen
beeinträchtigtdasLaufzeitverhalten:
• SicherungderRücksprungadresse
• Objektekopieren/erzeugen
• Hin-/Rücksprung
DeshalbkannmanFunktionenals
inline definieren.
std::cout << min(a,b) << endl;
return 0;
}
Damin() alsinline definiertist,wird
eineKopiederFunktionvomCompiler
andieseStelleeingesetzt.
std::cout << (a < b ? a : b) <<endl;
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
66
Verwendungvon
Inline-Funktionen/- Methoden
Inline-Funktionenbzw.-Methodenwerdenverwendet,wenn…
n …diesekurz sindund
n …diese(sehr)häufigaufgerufenwerden.
Vorteil:
DasProgrammkanneffizienter(schneller)werden.
Nachteil:
DasausführbareProgrammwirdgrösser(durch
Codevervielfältigung).
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
67
GlobaleFunktioneninC++
n
InC++könnenFunktionenglobal (ausserhalbvonKlassen)definiert
werden.SolcheFunktionengehörennicht zueinerbestimmtenKlasse–
siestelleninderRegelgenerellanwendbareAlgorithmenzurVerfügung.
float square(float x); // function declaration
...
float square(float x) { // function definition
return x*x;
}
...
int main(int argc, char** argv) {
float f = 5.0;
std::cout << "The square of " << f << " is " << square(f);
}
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
68
Default-ArgumenteinC++
n
InC++könnenFunktionenDefault-Argumente besitzen
float pow(float base, int exp=2);
// function declaration
...
float pow(float base, int exp) {
// function definition
if (exp == 0) return 1;
for (int i=1; i < exp; ++i) base *= base;
return base;
}
...
int main(int argc, char** argv) {
pow(5);
pow(5, 3);
}
// return 25
// return 125
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
K03
C++Einführung
1.
2.
3.
4.
5.
6.
Allgemeines
Entwicklungsprozess
GültigkeitsbereicheundNamespaces
Prozedur-/Funktionsaufrufe,Inlining,
Default-Argumente
ElementareTypenundStrukturen
VergleichJava/C++
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
70
DasTypsystem inC++
Elementare
Datentypen
Strukturen
enum struct union
Ganzzahlig
char
short
Adressen
Referenzen
class array
Zeiger
Gleitkommazahlen
bool
int
long
float
double
long double
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
71
ElementareDatentypeninC++
Typ
Nurbedingt
portabel!
typ.Speicherplatz- Wertemancher
TypenabhängigvonWortbreite
Wertebereich
1Byte
-128bis+127
unsigned char
1Byte
0bis+255(ASCII)
wchar_t
2byte
0bis+65'535(Unicode)
4Byte(inderRegel)
-2'147'483'648bis+2'147'483'647
unsigned int
4Byte(inderRegel)
+0bis+4294967295
short
2Byte
-32'768bis+32'767
unsigned short
2Byte
0bis+65'535
long
8byte
unsigned long
8byte
–9'223'372'036'854'775'808bis
+9'223'372'036'854'775'807
0bis+18'446'744'073'709'551'615
char
int
MitHilfedesOperatorssizeof kannmandenSpeicherbedarfvonVariablenbzw.
allenArtenvonDatentypenbestimmen,alsonichtnurvonelementaren.
Beispiele:
sizeof (char);
/* liefert 1 */
short myShort;
sizeof (myShort)
/* liefert 2 */
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
72
C++11(undC11):<stdint.h><cstdint>
PortableTypen:
Vorzeichenbehaftet Vorzeichenlos
Beschreibung
intmax_t
int8_t
int16_t
int32_t
int64_t
int_least8_t
int_least16_t
int_least32_t
int_least64_t
int_fast8_t
int_fast16_t
int_fast32_t
int_fast64_t
MaximalvonderZielplattformunterstützteBreite.
uintmax_t
uint8_t
uint16_t
uint32_t
uint64_t
uint_least8_t
uint_least16_t
uint_least32_t
uint_least64_t
uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t
1)Beispiel:64Bit-Plattform:
Genau8,16,32,64Bitbreit.
JenachZielplattformnichtdefiniert,wennTypmit
dieserBreitenichtexistiert.
Mindestens8,16,32,64Bitbreit.
KompaktesterTyp,dermind.n Bitbreitist;
praktischmeistidentischmitint*_t bzw.
uint*_t
Mindestens8,16,32,64Bitbreit.
WennbreitererTypbesser vonZielplattform
unterstütztwird,dannwirddieserbenutzt.1)
uinf_fast16 // angefordert à uint64_t // tatsächlich
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
50
KlassischeC-Strings
n
n
C-StringssindäquivalentzuArraysof char
Endenimmermit'\0' – mansagtsiesind 0-terminiert.
char a[5] = "abcd";
a[0] == 'a'
a[4] == '\0'
n
'a' 'b' 'c' 'd' '\0'
a
sizeof("abcd") == 5;
BeiderVerwendungklassischerC-StringssindeinigeDetailszu
berücksichtigen:
n
n
n
0-Terminierung
Speicherallokation
separateFunktionenfürSuche,Kopie,Teilstrings,etc ...in<string.h>
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
50
C++-Strings
n
DieC++StandardbibliothekbeinhaltetKlassestd::string
#include <string>
using namespace std;
// Achtung: kein .h
// Programmierer sind schreibfaul
string text1 = "A nice day"; // Die klassische Deklaration
string text2("A nice day"); // Äquivalent via Konstruktor
string copy = text1;
// Erzeugen einer Kopie
cout << "Text: " << copy;
// Ausgabe via C++ iostream
// Konvertierung in C-sytle string ist möglich, aber
// const verhindert, dass auf diesem Weg Daten verändert
// werden können
const char* text_p = copy.c_str();
text_p[0] = 'X';
// Fehler !
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
50
Strings:Zeichensatz&Kodierung
engl.charset &character encoding
n
n
EinZeichensatz isteinenichtleere,endlicheMengeanZeichen.
DieKodierung isteineAbbildungderZeicheneinesZeichensatzesauf
üblicherweiseGanzahlen(zurRepräsentationdieserimSpeicher).
♧1
^
Zeichensatz
n
n
𝛺
Z
0
1
0
1
1
0
1
0
૱ ö
1
1
1
1
0
1
1
0
∞ ?
✤
ß д
a @
...
Kodierung
InternationaleStandardswieASCII (1963),EBCDIC (1964),ISO8859
(1986),Unicode (1991)definiereneinerseitseinenZeichensatzund
andererseitsein- odermehrereverschiedeneKodierungen.
BeideBegriffewerdenhäufigvermischtodersynonymverwandt,
sindaberstriktgenommennichtdasselbe.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
76
Strukturen– struct
n
StrukturenfassenlogischzusammengehörendeDatenzusammen,z.B.:
struct student {
int id;
char name[80];
};
n
Structuremembers
FürdenEntwickler
n
n
n
Structuretag
id undname gehörennunzusammen
struct student erzeugteingemeinsamesDatenfeld
FürdenCompiler
n
n
id undname liegen„nebeneinander“ imSpeicher
struct student isteinkomplexerDatentyp,deranFunktionen
übergebenwerdenkann
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
77
Syntax&Verwendungvonstruct
Syntax einerC-Struktur
Definition(undDeklaration)
struct [name] {
<type> field1;
<type> field2;
…
} [instance list];
struct Foo foo;
struct point {
int a;
double b;
} objct1, objct2;
struct point objct3 = {1, 3.12}
Beispieldeklaration:
struct Foo {
int field1;
char field2;
};
Datenzugriff:
foo.field1;
“ZugriffaufFeldfield1 derInstanzfoo
derstruct Foo”
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
78
Forward-Declaration vonstruct
n
Problem:wiedeklariertmandiefolgendenbeidenstructs?
struct T
int y
int x
int x
S *s
T *t
Lösung:Forward-Deklaration
Vorgehensweisefunktioniertnurfür.
TypenderenGrösseschonbekanntist
(z.B.ZeigerundMethoden).
AnalogeVorgehensweiseauchbei
Klassen.
struct S
int y
struct S;
struct T {
…
S *s;
…
};
struct S {
…
T *t;
…
};
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
79
Speicherausrichtung(engl.alignment)
n
CompilerrichtetMembereinerStrukturimSpeicheran
vordefiniertenGrenzenaus*:
n
z.B.amWortanfang:wennsizeof(t) mod w != 0 (t istTyp,w Wortbreite
inBytes)dannwerdenLückeneingefügt(engl.padding).
struct foo {
char a;
int b;
char c;
} x;
n
n
n
32bit =4bytes
1000
a
L
c
b
1004
1008
ü
c
L
ü
k
e
x
42.1
c
k
e
Nachteil:EsgehtSpeicherplatzverloren.
Vorteil:schnellerSpeicherzugriffdaoptimaldurchHardwareunterstützt.
MancheCPUsunterstützennichtausgerichteteAnordnung,aber:
n
n
LangsamerwennmehralseinSpeicherzugriffund/oderCachemiss.
JenachHardwarekeinatomaresLesenbeimehrerenSpeicherzugriffen.
*Detailssiehez.B.:http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
80
Aufzählungen– enum
n
EineAufzählungisteinselbstdefinierterganzzahligerTypmit
Schlüsselwortenum
enum PrimaryColors {
RED = 2,
GREEN,
BLUE
};
n
n
n
PrimaryColors color = GREEN;
switch(color)
{
case RED:
...
case GREEN:
}
Default:ErsterWert(RED)wirdmit0 initialisiert
JederweitereKonstantehateinenumeinserhöhtenWertzum
Vorgänger
MankannaberauchdenerstenWertbeliebigwählen(RED = 2)
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
81
Syntaxvonenum
Deklaration
enum name {
OptionName [= int],
OptionName [= int],
…
} [instance list];
Definition
enum Color {
RED = -3,
GREEN = 4,
BLUE = 12
} color, *color_ptr;
enum Color c;
void drawCircle
(enum Color c);
Alle Werte können aber auch explizit
vorgegeben werden
Zeigervariable: Variable, die im
Speicher auf eine Speicherstelle
verweist, die einen Wert vom Typ
Color beinhaltet.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
82
Unions – union
n
n
StrukturbeideralleMemberandergleichenAdressebeginnen.
Anwendungsfälle:
n
n
SpeicherbereichdenmanmitWertenverschiedenerDatentypenbelegen
will;z.B.KnoteninBaumderWertevomTypint oder double enthalten
kann;d.h.Wertebereichist:int È double
Eherselten:UminterpretationvonDaten
union foo {
int i;
// 4 bytes
double d; // 8 bytes
} x;
x.i
int
x.d
int
=
y
=
z
3;
= x.i; // y = 3
3.5;
= x.i; // z = ?
niederwertige32bits von3.5
interpretiertals32-bitInteger
n
Grösse einesUnionimSpeicherentsprichtGrösse seinesgrössten
Member;imBeispiel:sizeof(x) = 8
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
83
Zusammenfsg.syntaktischerVarianten
1. Deklarationbenannte Struktur/Union/Enum:
struct
union
enum
name { /* ... */ };
2. Deklarationanonyme Struktur/Union/Enum undDefinitionVariable(n)diesesTyps:
struct
union
enum
{ /* ... */ } var_1, ..., var_n;
3. DeklarationbenannteStruktur/Union/Enum undDefinitionVariable(n)diesesTyps:
struct
union
enum
name { /* ... */ } var_1, ..., var_n;
4. Variablendefinition(en)einerzuvordeklariertenStruktur/Union/Enum:
struct
union
enum
name var_1, ..., var_n;
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
84
Schlüsselworttypedef
n
(i)
Typedef bietetdieMöglichkeit,TypeneinenneuenNamenzugeben
unsigned char mybyte;
typedef
unsigned char
BYTE;
BYTE mybyte;
n
n
n
BYTE istnuneinAlias fürunsigned char
BeideDefinitionenvonmybyte sindnunäquivalentfürden
Compiler
Vorteiledertypdef Definition:
n
n
Aussagekräftiger(Lesbarkeit)
MaschinenabhängigeTypenkönnenisoliertwerden.BeiderPortierung
mussnurderAlias„umgehangen“werden.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
85
Schlüsselworttypedef
(ii)
AnwendungaufStrukturen:
struct Student {
int id;
char name[80];
};
typedef struct {
int id;
char name[80];
} STUDENT;
struct Student st;
STUDENT st;
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
86
Schlüsselworttypedef
(iii)
Vorteil
n
n
MankannschnellaneinerStelleimCodedenTypeeiner
bestimmtenVariablenändern.
WirdhäufiginVerbindungmitstruct verwendet
struct point {
int a;
double b;
};
typedef struct point {
int a;
double b;
} POINT;
struct point objct2;
POINT objct2;
int normalNumber;
int smallNumber;
typedef int MYINT
int normalNumber;
MYINT smallNumber;
int normalNumber;
short smallNumber;
typedef short MYINT
int normalNumber;
MYINT smallNumber;
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
87
Schlüsselworttypedef
n
(iv)
DieLesbarkeiteinesProgrammswirddurchtypedef verbessert,
vorallembeikomplexenDatentypen,z.B.Funktionszeigern:
char* (*search)(float, int);
search isteinZeigeraufeineFunktion,diezweiEingabeParametervomTypfloat undint besitztunddieeinenZeiger
aufchar liefert
(spätermehrüberZeigerinC++)
typedef char* (*PTR_TO_FUNC) (float, int);
Besser(kürzer):
PTR_TO_FUNC search;
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
K03
C++Einführung
1.
2.
3.
4.
5.
6.
Allgemeines
Entwicklungsprozess
GültigkeitsbereicheundNamespaces
Prozedur-/Funktionsaufrufe,Inlining,
Default-Argumente
ElementareTypenundStrukturen
VergleichJava/C++
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
89
ElementareDatentypeninJava/C++
ElementareDatentypen inJava
ElementareDatentypen inC++
n
boolean
n
bool
n
byte
n
(unsigned) char
n
char
n
wchar_t
n
short
n
(unsigned) short
n
int
n
(unsigned) int
n
long
n
(unsigned) long
n
float
n
float
n
double
n
double
n
long double
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
90
VergleichJava/C++– Zuweisungen
InJava istdasVerhaltenvon
elementarenDatentypenund
Objektenunterschiedlich
InC++ istdasVerhaltenvon
elementarenDatentypenund
Objektenidentisch
Java
C++
inta=0;
//Creationofaninteger
intb=a;
//bholdsacopy ofa
b=42;
//onlybischanged
Bodyx;
//noobjectcreation
Bodyy =x;
//y holds areference to x
y.setVol(42); //yandxarechanged
=
=
=
≠
≠
≠
int a=0;
//Creation of aninteger
int b=a;
//bholds acopy of a
b=42;
//onlybischanged
Bodyx;
//theobjectxiscreated
Bodyy =x;
//y holds acopy of x
y.setVol(42);
//onlyyischanged
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
91
VergleichJava/C++― Referenzen
InC++ gibtesdieMöglichkeit,explizitReferenzenzubenutzen―
damitverhaltensichdannObjektewieObjekteinJava
Java
C++
Bodyy =x;
//y holds a
//reference to x
=
Body&y =x;
//y holds a
//reference to x
y.setVol(42);
//y and xare
//changed
=
y.setVol(42);
//y and xare
//changed
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
92
Vergl.Java/C++― Funktionsaufrufe
Funktions-DeklarationinJava
Funktions-DeklarationinC++
Java
C++
voidf1(int a)
{
a=42;
}
//aisacopy
voidf2(Bodyx)
{
x.setVol(42);
}
//xisareference
//Call
f1(b);
//bisnotmodified
f2(y);
//yismodified
=
voidf1(int a)//aisacopy
{
a=42;
}
≠
voidf2(Bodyx)//xisacopy
{
x.setVol(42);
}
=
≠
//Call
f1(b);
//bisnotmodified
f2(y);
//yisnotmodified
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
93
Vergl.Java/C++― CallbyReference
Funktions-DeklarationinJava
Funktions-DeklarationinC++
Java
C++
voidf2(Bodyx)//xisareference
{
x.setVol(42);
}
//Call
f2(y);
//yismodified
=
=
voidf2(Body&x)//xisareference
{
x.setVol(42);
}
//Call
f2(y);
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
//yismodified
24.März2017
94
VergleichJava/C++― Referenz
Achtung: InC++kannmaneineReferenzaufeinObjekt
nachderErzeugungnichtmehrändern
Java
C++
Bodya;
Bodya;
Bodyb;
Bodyb;
Bodyc=a;//creferstoa
c=b;
//now,c
//referstob
=
≠
Body&c=a;//creferstoa
c=b;
//biscopiedtoc
//(whichisa)
Body&d;
//ERROR! dpoints
//nowhere
InC++isteineReferenzeinandererName(“Aliasname”)füreinbereitsexistierendes
Objekt.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
95
VergleichJava/C++– Ausführung
C++
n
Java
Compiler:Quelltextwirdkompiliert
(= übersetztinMaschinencode):
+ OptimaleLeistungmöglich.
- WenndasProgrammaufunterschiedlichenBetriebssystemen
(Linux,Windows,Mac,...)oder
Architekturen(Sparc,ARM,X86)
laufensoll,dannmussmanauch
unterschiedlicheVarianten
verwalten.
§ Interpreter/Just-in-timeCompiler:Java
Byte-CodeistGrundlagederAusführung
durchdieJavaVirtualMachine:
+ DerByte-Codekann(ohneweiteres)
aufallenArchitekturenausgeführt
werden,fürdieeineJVMverfügbarist.
+ ModerneJVMshabenJust-in-time
Compiler:wirdByte-Codeoftgenug
ausgeführt,dannwirderzurLaufzeit
kompiliertunddanachalsMaschinencode ausgeführtà optimale
Leistung nacheinergewissenLaufzeit.
- OverheaddurchSpeicherverwaltung
undgeprüfteSpeicherzugriffe.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf
24.März2017
Herunterladen