Programmeren in C en C++
INHOUDSOPGAVE
HOOFDSTUK 1: BASISCONCEPTEN IN C++.......................................................................................... 4
NIEUWE DATATYPES............................................................................................................................... 4
FUNDAMENTELE DATATYPES..................................................................................................................... 4
CONVERSIES ......................................................................................................................................... 4
HET TYPE STD::STRING (STANDAARDSTRINGS)............................................................................................... 4
DEFAULT PARAMETERS ............................................................................................................................ 8
REFERENTIETYPES .................................................................................................................................. 8
FUNCTIE-TEMPLATES ~ GENERICS (JAVA) ~ VOID POINTERS (C) ..................................................................... 10
CONSOLE INVOER EN UITVOER................................................................................................................ 11
UITVOER ............................................................................................................................................ 11
INVOER.............................................................................................................................................. 12
NAMESPACES ~ PACKAGES (JAVA) .......................................................................................................... 13
WERKEN MET BESTANDEN..................................................................................................................... 14
BESTAND INLEZEN: #INCLUDE “BESTAND” ................................................................................................. 14
DECLARATIE INVOERBESTAND/UITVOERBESTAND ........................................................................................ 14
OPENEN BESTAND ................................................................................................................................ 14
OVERZICHT ......................................................................................................................................... 17
DYNAMISCH GEHEUGENBEHEER.............................................................................................................. 17
HOOFDSTUK 2: NIEUWE FEATURES SINDS C++ 11 (DEEL 1) ............................................................. 18
FUNCTIES ALS PARAMETERS ................................................................................................................... 18
LAMBDA FUNCTIES............................................................................................................................... 19
CAPTURE-LIST ..................................................................................................................................... 20
NULLPTR............................................................................................................................................ 20
SMART POINTERS: UNIQUE_PTR EN SHARED_PTR....................................................................................... 20
UNIQUE_PTR....................................................................................................................................... 21
SHARED_PTR ...................................................................................................................................... 22
HOOFDSTUK 3: COLLECTIONS ......................................................................................................... 22
INLEIDING COLLECTIONS ........................................................................................................................ 22
ITERATOREN ....................................................................................................................................... 23
SEQUENCES ........................................................................................................................................ 24
GROEITABEL (STRING EN VECTOR) ............................................................................................................ 24
GELINKTE LIJST (LIST)............................................................................................................................. 29
1
,DOUBLE-ENDED QUEUE (DEQUE) ............................................................................................................. 30
CONTAINER ADAPTERS ......................................................................................................................... 31
STAPEL (STACK) ................................................................................................................................... 31
WACHTRIJ (QUEUE) .............................................................................................................................. 32
PRIORITEITSWACHTRIJ (PRIORITY_QUEUE) ................................................................................................. 33
ASSOCIATIEVE CONTAINERS ................................................................................................................... 33
VERZAMELING EN MULTI-VERZAMELING .................................................................................................... 33
AFBEELDING EN MULTI-AFBEELDING ......................................................................................................... 35
OPMERKING MAP<INT,…> « VECTOR <…> .............................................................................................. 38
OVERZICHT ........................................................................................................................................ 39
HOOFDSTUK 4: OGP IN C++ ............................................................................................................. 40
KLASSEN IN C++.................................................................................................................................. 40
WERKING CONSTRUCTOR-DECONSTRUCTOR.............................................................................................. 42
DELEGERENDE CONSTRUCTOREN.............................................................................................................. 43
COPY-CONSTRUCTOR ........................................................................................................................... 44
SEPARATE COMPILATIE ......................................................................................................................... 44
OBJECTEN ALS ATTRIBUTEN ................................................................................................................... 44
FRIEND FUNCTIES EN KLASSEN ................................................................................................................ 45
OPERATOR OVERLOADING..................................................................................................................... 46
UNAIRE OPERATOR ............................................................................................................................... 48
OVERLOADEN VAN EEN TOEKENNINGSOPERATOR ........................................................................................ 48
OVERLOADEN VAN PREFIX EN POSTFIX OPERATOREN ++ EN – ......................................................................... 49
BEVRIENDE OPERATOREN....................................................................................................................... 52
OVERLOADEN IOSTREAM-OPERATOREN << EN >> ....................................................................................... 52
KLASSE-TEMPLATES.............................................................................................................................. 54
HOOFDSTUK 5: OVERERVING .......................................................................................................... 55
PUBLIC VERSUS PRIVATE OVERERVING ...................................................................................................... 55
CONSTRUCTOREN/DESTRUCTOR IN AFGELEIDE KLASSE ................................................................................. 56
CONSTRUCTOREN IN AFGELEIDE KLASSEN ................................................................................................... 56
USING ............................................................................................................................................... 57
DESTRUCTOR IN AFGELEIDE KLASSEN ........................................................................................................ 58
OVERSCHRIJVEN TOEKENNINGSOPERATOR ................................................................................................ 59
KEYWORD PROTECTED .......................................................................................................................... 59
MULTIPLE INHERITANCE ........................................................................................................................ 59
POLYMORFISME EN DYNAMIC BINDING .................................................................................................... 60
POLYMORFISME ................................................................................................................................... 60
DYNAMIC BINDING ............................................................................................................................... 62
VIRTUELE DESTRUCTOR ......................................................................................................................... 63
ABSTRACTE KLASSEN ............................................................................................................................ 63
2
,HOOFDSTUK 6: EXCEPTION HANDLING ........................................................................................... 65
VOORBEELD FACULTEIT ......................................................................................................................... 65
EXCEPTION HANDLING........................................................................................................................... 66
OPVANGEN VAN 1/MEERDERE SPECIFIEKE EXCEPTIE(S).................................................................................. 67
OPMERKINGEN .................................................................................................................................... 67
EXCEPTION CLASSES.............................................................................................................................. 68
VOORBEELD BESTAANDE EXCEPTIEKLASSE .................................................................................................. 69
ZELFGEMAAKTE EXCEPTIEKLASSE .............................................................................................................. 69
HOOFDSTUK 7: NIEUWE FEATURES (SINDS C++11): DEEL 2 ............................................................. 71
AUTOMATISCHE TYPE-AFLEIDING (AUTO).................................................................................................. 71
GEWIJZIGDE INITIALISATIESYNTAX ........................................................................................................... 71
DEFAULTED EN DELETED LIDFUNCTIES....................................................................................................... 73
MOVE CONSTRUCTOR EN MOVE OPERATOR ............................................................................................... 73
IMPLEMENTATIE .................................................................................................................................. 74
BIG TREE « BIG FIVE ........................................................................................................................... 77
3
,HOOFDSTUK 1: BASISCONCEPTEN IN C++
• C++ = uitbreiding van C
o Datatype bool
o Standaardstring
o Overloading (functies en operatoren)
o Default parameters
o Klassen
o Templates
o …
NIEUWE DATATYPES
FUNDAMENTELE DATATYPES
• Bool
o Waarden true/false
o Automatische conversie: bool à int (true = 1, false = 0)
• Geen voorwaartse referenties: variabelen op willekeurige plaats
CONVERSIES
• Automatisch bij toekenningsoperatoren en rekenkundige opdrachten
(zelfs bij verlies info)
• Expliciet = casten
o Operator-syntax: (type)uitdrukking
o Functieoproep-syntax: type(uitdrukking)
double d; int i;
i = (int) (d*2+3);
i = int (d*2+3);
HET TYPE STD::STRING (STANDAARDSTRINGS)
• 2 soorten strings
4
, o C-strings (“…”)
o Std::string
§ #include <string> (bovenaan)
• Declaratie & initialisatie
o Geen new ~ malloc (bijna nooit gebruikt)
o Function/constructor overloading toegestaan
std::string s1; //s1 is een lege string
s1 = “Hij zegt: \”Hallo\”\n”;
std::string s2(“test”);
std:: string s3 = s2; // s3 is een kopie van s2
std:: string s4(s3); // copyconstructor
std:: string s5(10, ‘c’);
• Concatenatie van strings
o Strings kan je optellen
std::string s = “dag”;
s = s + “ jan”;
s += ‘!’;
std:: string t = “dag” + s + “ jan”;
o C-strings kan je niet optellen
FOUT: t = “dag” + “ jan” + s;
• Vergelijken van strings
o C-strings: m.b.v. stringcompare (anders worden pointers vergeleken)
Std:: string s, t;
if (s < “tomaat”) à komt s alfabetisch voor “tomaat” ?
if (s >= t ) à is s alfabetisch groter dan t?
if (s == “stop”) à bevat s het woord “stop”?
• Lengte van een string
std:: string s = “dag”;
int l = s.size(); // 3
int k = s.length(); // 3
• String ontleden
o [ ] mogelijk
5
,o for-each lus mogelijk
o C++ maakt ook geen probleem om strings op te tellen
std::string s = “hallo”;
for (int i = 0; i < s.size(); i++)
printf(“%c”, s[i]); // of: cout << s[i];
s[1] = ‘e’;
for (char c: s)
printf(“%c”, c); // C11++ of: cour << c;
STRING_VB.CPP
o Oefening: Schrijf een functie omgekeerde(s) die de omgekeerde string van de
gegeven string s teruggeeft. (als s = “voorbeeld” wordt “dleebroov”)
std::string omg1 (std::string);
std::string omg2 (std::string);
std::string omg3 (std::string);
int main() {
std::string s = "voorb";
srd::string res = omg1(s); // uittesten ≠ methodes
}
std::string omg1(std::string s){
std::string res;
for (int i = s.size() - 1; i >= 0; i--){
res += s[i];
}
return res;
}
std::string omg2(std::string s){
std::string res = 5;
for(int i = 0; i < s.size(); i++){
res[s.size()-i-1] = s[i]; // size = 0 want lege string
}
return res;
} // geen goede oplossing: string blijft leeg
std::string omg3(std::string s){
std::string res;
for(char c: s){
res = c + res;
}
return res;
} // telkens array verschuiven om vooraan toe te voegen
6
,• Enkele functies uit de string-bibliotheek (zie API)
o Find
§ Geeft de positie in de string waar de deelstring s voor het eerst optreedt,
vanaf positie pos
§ Geeft string::npos terug als s niet gevonden wordt
§ Laatste parameter = default parameter
- Bij oproep functie is 2e parameter optioneel, staat standaard op 0
int find(string s, int pos=0)
o Insert
§ Voegt de string s in op positie pos
void insert (int pos, string s)
o Substring
§ Geeft de deelstring opgebouwd uit de eerste len tekens, vanaf positive pos
string substr (int pos = 0, int len = npos)
o Erase
§ Verwijdert in de string len tekens, vanaf positie pos
void erase (int pos = 0, int len = npos)
o Replace
§ Vervangt de string len tekens, vanaf positie pos, door deelstring s
void replace (int pos, int len, string s)
• Voorbeeld
o Inhoud s = “Een voorbeeld “
7
,DEFAULT PARAMETERS
• Function overloading
void schrijg_lijn (char, int);
void schrijf_lijn (char); // print 80x meegegeven char
void schrijf_lijn (); // print 80x ‘-‘
• Korter: default parameters
void schrijf_lijn (char = ‘-‘, int = 80);
• Opmerkingen
o Default parameters moeten achteraan staan in de parameterlijst
o Bij definitie functie: default waarden niet meer herhalen
o Kan ook met char = 15 à ascii-code
VB_DEFAULT_PARAMETERS.CPP
REFERENTIETYPES
• Declaratie: type&
o Verplichte initialisatie bij declaratie (geen NULL)
o Bevat automatisch het adres van een andere variabele (geen & voor variabele!)
o Automatisch gederefereerd (geen *)
int a; int &x = a; // niet: &a
x = 5; x++; // geen *x
int &y; // FOUT: geen initialisatie
• Vaak als formele parameter
o Int &x à gemaakt bij oproep swap
o Keuze
§ By value = kopie
§ Refereren => geen pointers bij aanpassen
8
, int c; // veranderen --> pointer (anders kopie)
void wissel(int *a, int *b){
int hulp = *a;
*a = *b;
*b = hulp;
}
int g1, g2;
wissel(&g1, &g2);
• Oefening
void vkw(double, double, double, int&, double&, double&);
// zie oefening in C
• Gebruikt om kopie te vermijden
o Bijna altijd een referentie!
o Geen kopie van de structs à pointers
9