Conditionele expressie expressie1 ? expressie2 : expressie3 Vb. z = (a < b ? a + 1 : b – 1) If (a < b) z = a + 1 else z = b – 1; Voordeel: compactere code
De komma-operator expressie1 , expressie2 Beide expressies worden in gegeven volgorde geëvalueerd en de waarde van expressie2 wordt als waarde van de gehele komma-expressie afgeleverd
Komma-operator voorbeeld S = 0; while (cin >> i , i > 0) s+=i;
Het afsluiten van een rij ingetypte getallen int main() {double s=0,x; cout << “Tik getallen in,gescheiden door spaties,\n” << “met een regel tekst na het laatste getal:\n”; while (cin >> x , !cin.fail()) s+= x; cin.clear(); char ch; do cin.get(ch); while (ch != ‘\n’); cout << “de eerste som is “ << s << endl; s = 0; cout << “Nog een keer alstublieft:\n”; while (cin >> x , !cin.fail()) s+= x; cout << “de tweede som is “ << s << endl; return 0; }
bitmanipulatie & bitsgewijze EN : 1001 & 1100 = 1000 | bitsgewijze OF : 1001 | 1100 = 1101 ˆ bitsgewijze XOR : 1001 ^ 1100 = 0101 ˜ INVERSIE: ˜1010 = 0101 « SCHUIVEN NAAR LINKS: 0101 1010 << 3 = 1101 0000 » SCHUIVEN NAAR RECHTS(machine- / compilerafhankelijk) 0101 1010 >> 3 = 0000 1011
unsigned Kan voor short, int en long Unsigned = unsigned int Variabelen van deze types kunnen niet negatief worden Meest linkse bit is geen tekenbit, maar macht van 2 Positief getalbereik X 2
Eenvoudige arrays int a[100]; a[0],a[1],…,a[99] a[3 * i + 1] const int aantal = 100; int a[aantal];
Array initialiseren int a[3] = {15,20,8}; float b[4] = {12.0,3.1}; float c[5]; b[4] = {12.0,3.1,0,0} char naam = {‘J’,’a’,’n’}; char naam = “Jan”;
Definitie en declaratie van een functie #include <iostream> using namespace std; float fun (float x, float y, int i, int j) {int noemer = i – j; return noemer == 0? 1e20 : (x – y)/noemer } int main() {float xx, yy; int ii,jj; cout << “Geef twee float en twee int waarden:”; cin >> xx >> yy >> ii >> jj; cout << “berekende functiewaarde:”; << fun(xx,yy,ii,jj) << endl; return 0;}
functies Type-conversie voor parameters en return waarde (!automatische conversie van vb. double naar int = afkapping) Volgorde van functies (altijd declareren voor gebruik; definitie kan later) void geen parameters
Klasse met lidfuncties Lidfuncties = methoden uit java class naam { public: … private: } int main(){
klasse vkv v; Object van het type vkv aanmaken (geheugenruimte voorzien voor de lidvariabelen) v.coeff(a,b,c) (lidvariabelen a,b,c van v krijgen waarden uit main) double wortel1() const {return x1;} (const object v ongewijzigd door oproep) Lidvariabelen graag private struct ipv class (default public ipv private)
klassen Lidfuncties buiten de klasse definiëren Wanneer? Als de functies wat uitgebreider zijn Wel declareren binnen de klasse; definitie erbuiten: Vb. in klasse: bool losOp(); (declaratie) buiten klasse: bool vkv::losOp() … (definitie)
constructoren Cf java: i.e.lidfuncties die automatisch worden aangeroepen bij het creëeren van een nieuw klasse-object naam = naam klasse geen new (java) vkv(1.0,2.0,3.0) Constructor zonder parameters: vkv v; niet vkv v();!
Overloading en default-parameters Onderscheid door het aantal en/of type van parameters Zowel voor constructors, lidfuncties als functies in programma Default-waarden aan parameters geven binnen delaratie of definitie; zelfde constructor (of lidfunctie) wordt gebruikt met één of meer argumenten, voor overige worden achteraan beginnend default-waarden verondersteld
& en const bij parameters Cf. vensters.cpp p. 86 venster omvattend (venster v) {...} v is waardeparameter dwz KOPIE VAN van v doorgeven aan functie origineel kan niet wijzigen door de uitvoer van de functie, aangezien het gaat om een kopie venster omvattend (venster &v) {...} v is referentieparameter, dwz WIJZER NAAR (= adres van) v doorgeven (efficiëntie!) Origineel kan WEL veranderen door het uitvoeren van de functie
& en const bij parameters venster omvattend (const venster &v){…} Door const te gebruiken geven we aan dat het onmogelijk is binnen de functie het argument te wijzigen (veiligheid!)
& en const bij parameters Schrijf geen & en const bij primitieve types, tenzij punt 3 van toepassing is Schrijf & en const bij klassetypes, tenzij punt 3 van toepassing is Als je het argument wilt wijzigen, schrijf dan wel & maar geen const
inlining Inline functies worden niet geïmplementeerd als gewone functies (op een andere plaats in het geheugen en dan met parameterbindingen), maar de code van de functie wordt gewoon gesubstitueerd op de plaats van de aanroep Voordeel: sneller!! Ook lidfuncties binnen de klasse zal de compiler implementeren als inline-functies
inlining Na compilatie, bij uitvoering: oplossing: functie-code ergens in geheugen bij functie- aanroep: voorbereiding: bvb argumenten doorgeven via registers Sprong naar functiecode, achteraf sprong terug nadelig voor zeer korte functies, vooral in lus oplossing: aangeven dat we inline code wensen mbv keyword inline compiler kopiëert de functiecode tussen de overige code : meer code, maar geen sprongen meer!!
Inlining voorbeeld inline int minimum (int a, int b) { return (a < b ? a : b); } int min = minimum (tel, noem); int min = (tel < noem ? tel : noem); i. p. v. sprong naar functie