[C++] Een korte inleiding tot C++

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

Glenn
Posts: 280

[C++] Een korte inleiding tot C++

Post#1 » Wed Jul 06, 2011 10:57 pm

Sinds het academiejaar 2011-2012 wordt "Inleiding C++" gedoceerd in het 1ste semester. Om er voor te zorgen dat jullie allemaal snel zullen weg zijn met C++ heb ik hieronder kort een aantal belangrijke begrippen en concepten besproken die je zal tegenkomen in de wereld van C++. Het is zeker nuttig om deze topic door te nemen wanneer je gaat starten met het programmeren in C++. Hierdoor raak je ook wat vertrouwd aan de C++ - syntax. Bedenk zelf ook hoe deze concepten gerealiseerd worden in Python.

compilatie
C++ is een taal met compilatie. Dat brengt met zich mee dat vooraleer een programma kan uitgevoerd worden, het volledige programma zal moeten omgezet worden in 1'en en 0'en. Deze compilatie gebeurt door een compiler. C++ laat gescheiden compilatie toe. Dat betekent dat verschillende eenheden van het programma afzonderlijk van elkaar (en op een ander tijdstip), kunnen gecompileerd worden. Zo een afzonderlijke eenheid wordt een "translation unit" genoemd en bestaat typisch uit een .cpp-bestand (source file) en bijhorende .h-bestanden (header files).
Wanneer alle afzonderlijke eenheden gecompileerd zijn, worden ze met elkaar verbonden door de linker. Wanneer het linken voltooid is, dan zal er een executable gegenereerd worden. In Windows hebben deze executables meestal de .exe extentie, terwijl ze in Linux meestal extensieloos zijn.

een eerste C++-programma
Een C++-programma begint typisch bij de main() functie. Wanneer deze functie volledig uitgevoerd is, dan wordt het programma beindigd. Een eenvoudig C++ - programma zou er bijvoorbeeld als volgt kunnen uitzien

main.cpp

Code: Select all


#include <iostream>

int main() {
std::cout << "hallo wereld \n";
}
hierbij valt het includeren van iostream direct op. De regel #include <iostream> zorgt er immers voor dat de header iostream geincludeerd wordt. In deze header staan declaraties van enkele belangrijke functies en objecten om de input en de output te regelen. Zo is std::cout een object van klasse ostream dat op een niet triviale manier zijn argumenten binnenkrijgt. Bij "normale" functies worden de argumenten meegegeven tussen kleine haken in een door komma's gescheiden lijst. Bij C++ bestaat er echter ook zoiets als operator overloading, waardoor argumenten op een minder triviale manier kunnen doorgegeven worden. Bovenstaand programma bevat dus het object cout dat via zijn operator<< -functie argumenten kan meekrijgen.

Een tweede punt dat valt te bemerken is dat van std:: . In C++ komen objecten en functies vaak in namespaces voor. Een namespace is een ruimte waarbinnen een reeks objecten en functies voorkomen met ondubbelzinnige namen. In een namespace wiskunde zouden bijvoorbeeld de functies double cos(double x), double sin(double x) en double tan(double x) kunnen voorkomen. De namespace std is een namespace waarin heel wat handige functies gedeclareerd en gedefinieerd zijn. Hierbij denk ik bijvoorbeeld aan lijsten, vectoren, algoritmes, ... . Wanneer je functies en objecten wil gebruiken die buiten je namespace gedeclareerd zijn, dan zal je deze moeten kwalificeren met de naam van de namespace gevolgd door de scope operator (::). In ons programma bevinden we ons in de default namespace. Daarom moeten we std::cout schrijven om het object cout uit de namespace std te gebruiken.

modules
In C++ zijn modules (of in de Java context ook wel packages genoemd) niet fysiek tastbaar. We zullen modulariteit daarom trachten te verkrijgen met namespaces. We zullen functies en objecten die met elkaar te maken hebben typisch declareren en definieren in eenzelfde namespace. Zo kan je voor een game als "space invaders" bijvoorbeeld een namespace si maken. Om een spaceship te declareren en te definieren in de namespace si, zullen we als volgt te werk gaan.

spaceShip.h

Code: Select all


namespace si {
class SpaceShip{
public:
void fire();
int getHp();
void setHp(int hp);
private:
int fHp; // number of hitpoints
int fBullets // number of bullets left
};
}
spaceShip.cpp

Code: Select all


#include "spaceShip.h"

namespace si {
void SpaceShip::fire() {
fBullets = fBullets - 1;
std::cout << "we schieten een kogel" << std::endl;
}
int SpaceShip::getHp() {
return fHp;
}
void SpaceShip::setHp(int hp) {
fHp = hp;
}
}
Om dit object dan in een andere namespace (bijvoorbeeld de default namespace) te gebruiken, moeten we het object kwalificeren.

main.cpp

Code: Select all


#include "spaceShip.h"

int main() {
si::SpaceShip ship();
ship.setHp(100);
ship.fire();
}
Merk tevens even op dat je enkel "spaceShip.h" moet includeren en NIET "spaceShip.cpp". We hebben hier namelijk twee aparte translation units. De eerste translation unit bestaat uit main.cpp en spaceShip.h. De tweede translation unit bestaat uit spaceShip.cpp en spaceShip.h . De C++ - linker weet nu perfect hoe hij beide translation units met elkaar moet verbinden. De eerste translation unit hoeft totaal geen weet te hebben van hoe spaceShip geimplementeerd is. De C++ - linker zal beide delen wel aan elkaar hangen.

types: declaratie en definitie
Om een variabele in C++ te gebruiken, zal men deze eerst moeten declareren. Hiermee wordt bedoelt dat je aan elke variabele zal moeten zeggen van welk type hij is. Voorbeelden van declaraties zijn

Code: Select all


int i;                  // i is een geheel getal
double j; // j is een decimaal getal
std::string s; // s is een string
Car c1; // c1 is een Car
Car* c2; // c2 is een pointer naar een Car
Een declaratie kan soms ook een definitie zijn, zoals in

Code: Select all


int i = 5;
std::string zin = "hallo allemaal";
Car* c5 = new Car();
Car c6("ferrari",140);
Car c7;
maar dat is niet verplicht. Je kan hem ook eerst declareren, om hem vervolgens te gebruiken.

Code: Select all


int getal;
getal = 5;
std::cout << "het getal is gelijk aan " << getal << std::endl;
pointers
In C++ wordt er veel gebruik gemaakt van pointers. Pointers heb je in C++ immers nodig om op run-time geheugen te alloceren. Hiervoor gebruiken we meestal de operator new van een object. Bijvoorbeeld: wanneer we op run-time geheugen willen vragen voor een nieuw Car-object, zullen we als volgt te werken gaan.

example1.cpp

Code: Select all


int main() {
// heel wat operaties
Car* c = new Car(); // we vragen dynamisch geheugen aan
// heel wat operaties
}
Hier valt wel te bemerken dat wanneer men in C++ op run-time geheugen aanvraagt, men zelf moet instaan voor het terug vrijgeven van dit geheugen. Wanneer je dit niet doet dan ontstaan er memory leaks. Dit kan er in de praktijk voor zorgen dat je programma na verloop van tijd trager en trager wordt. Geheugen terug vrijgeven doen we in C++ meestal met operator delete. Als we in ons voorbeeld het geheugen dat we gereserveerd hebben voor c, later terug willen vrijgeven dan doen we

example2.cpp

Code: Select all


int main() {
// heel wat operaties
Car* c = new Car(); // we vragen dynamisch geheugen aan
// heel wat operaties
delete c;
// heel wat operaties
}
pass by value / pass by reference
In C++ kan je variabelen aan een functie by value en by reference doorgeven. Wanneer je een variabele by value doorgeeft, dan zal er eerst een copy van die variabele gemaakt worden en deze zal dan worden doorgegeven. Als de variabele een object is, dan wordt de copy-constructor van dit object opgeroepen. Wanneer de functie wordt beindigd, dan is de waarde van de variabele onaangepast.
Wanneer je een variabele by reference doorgeeft, dan zal het geheugenadres van de variabele in kwestie doorgegeven worden. Wanneer de functie wordt beindigd, dan is de waarde van de variabele wel aangepast.

pass by value

Code: Select all


void rekenFunctie(int a, int b, int resultaat) {
resultaat = a + b;
}

int main() {
int getal1 = 5;
int getal2 = 10;
int getal3 = 0;
rekenFunctie(getal1,getal2,getal3);
std::cout << "getal 3 = " << getal3 << std::endl;
}
levert als resultaat: getal 3 = 0

pass by reference

Code: Select all


void rekenFunctie(int a, int b, int& resultaat) {
resultaat = a + b;
}

int main() {
int getal1 = 5;
int getal2 = 10;
int getal3 = 0;
rekenFunctie(getal1,getal2,getal3);
std::cout << "getal 3 = " << getal3 << std::endl;
}
levert als resultaat: getal 3 = 15

objecten
Wanneer we in C++ over objecten spreken, dan hebben we het vaak over een pointer naar een instantie van een klasse. Bijvoorbeeld een pointer naar een Car, een pointer naar een SpaceShip, een pointer naar een Entity, ... .
Concreet ziet een object er in C++ dat als volgt uit

Code: Select all


Car* c = new Car();   // een Car object
SpaceShip* spaceShip = new SpaceShip(); // een SpaceShip object
Entity* e = new Entity(); // een Entity object
Een voordeel dat we hebben bij het werken met een pointer naar een object is dat we gebruik kunnen maken van polymorfisme. Wel moeten we met een pointer naar een instantie van een klasse heel goed opletten dat we het geheugen terug vrijgeven met de operator delete. Als we dit vergeten krijgen we memory leaks en kan ons programma trager worden.

Als we het niet hebben over een pointer naar een instantie van een klasse dan hebben we het over de instantie van de klasse zelf. Concreet ziet een object er in C++ dan als volgt uit.

Code: Select all


Car c;
SpaceShip spaceShip;
Entity e;
Last edited by Glenn on Sat Jul 09, 2011 10:32 pm, edited 5 times in total.

User avatar
Pedro
Prosenior
Posts: 3251

Re: [C++] Een korte inleiding tot C++

Post#2 » Thu Jul 07, 2011 3:18 pm

Nice Glenn! Stickied it!
WINAK Scriptor 2010-2011
WINAK Zedenmeester 2010-2011
WINAK Vice-Praeses 2011-2012
WINAK Praeses 2012-2013
WINAK Praegustator 2013-2014

User avatar
djgl3nn
WOZ
Posts: 1938

Re: [C++] Een korte inleiding tot C++

Post#3 » Thu Jul 07, 2011 5:22 pm

Ik heb er een mededeling van gemaakt, en de oude uitleg over programmeren 'normaal' gemaakt.
Die over computer systemen gewoon 'sticky'.

Merci voor de goede uitleg :)
WINAK Schacht 2009-2010
WINAK Sport 2010-2011
WINAK Mentor Informatica 2011-2012
WINAK Ouwe Zak 2012-...

UA Sportraad Webmaster 2012-...

User avatar
racekakje
WOZ
Posts: 740

Re: [C++] Een korte inleiding tot C++

Post#4 » Sat Oct 01, 2011 11:00 am

"Hallo wereld" -> hilarisch

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 8 guests

cron