Archief - [PROG][C++] constructors en destructors in een klasse

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

IceSkull[BE]

Legacy Member
kan iemand me uitleggen hoe constructors en destructors werken? ik heb dingen gehoord over new, en delete, maar hoe werken ze, en wat is de functie? Sry als ik soms teveel vragen stel, maar de boeken die ik nu lees zijn toch behoorlijk moeilijk.. :doh:

voor antwoorden -> :niceone:

steinerwarrior

Legacy Member
Constructors. Dit is de member functie die gebruikt word om een object een begin toestand te geven. Deze zal bij het creëren van een object zorgen voor een voorinstelling van de waardes van interne variabelen.
Destructors. Deze member functie ruimt een object netjes op uit het geheugen, als de levenduur van het object afgelopen is.
Modifiers. Dit zijn member functies die iets aan de interne toestand van het object veranderen, bijvoorbeeld in het geval van de bankrekening kan de methode StortBedrag het saldo veranderen.
Selectors. Dit zijn member functies die de interne toestand van een object terugmelden. Deze zullen niets aan de interne toestand veranderen. Dit is dus een read-only bewerking, het mag niets aan de interne toestand van het object veranderen.
De constructor en destructor zijn interne functies van het object, de modifier en de selector zijn van buiten het object te gebruiken.

Anders hier is er een goeie cursus over C++;:http://ontwerpen1.khlim.be/~lrutten/cursussen/inf4/cpp.html#id2433531

killgore

Legacy Member
constructor -> methode die wordt aangeroepen bij creatie object. Hierin kan je leuk geheugen reserveren dat je nodig hebt. Je kan hier ook constructors maken met argumenten om je variabelen te laten initialiseren bij aanmaak. Maak dit echter niet te uitgebreid want constructors kunnen geen return doen. Ik prefereer initialiseren door modifiers (setter injection).
destructor -> methode die wordt aangeroepen bij vernieling object (zonder parameters, niet overlaadbaar). Hier kan je geheugen weer vrijgeven dat je had gereserveerd.

Tyfius

Legacy Member
http://users.telenet.be/tyfius/voorbeeld/

Heb voor iemand op IRC daar een voorbeeldje gemaakt tijdje terug.

Basicly maak ik een Persoon aan, en een Persoon heeft een Adres. Een Adres heeft een huisnummer, maar omdat dit een huisnummer tot de primitieve types behoort (hiermee bedoel ik int, float, double) moet ik die niet expliciet verwijderen in de destructor. In Persoon moet ik daarentegen WEL zelf adres verwijderen.

Er staat slechts 1 fout in de code, wat ik nu opmerk, ik delete op het einde van mijn programma het Persoon object niet. :)

Juiste main.cpp:
Code:
#include <iostream>
#include "persoon.h"
using namespace std;

int main()
{
    Persoon *P = new Persoon(20, 25, 1820);

    cout << "Leeftijd: " << P->getLeeftijd() << endl;
    cout << "Huisnummer: " << P->getAdres()->getHuisnummer() << endl;
    cout << "Postcode: " << P->getAdres()->getPostcode() << endl;
    
    delete P;
    return 0;
}

Hale

Legacy Member
Tyfius zei:
http://users.telenet.be/tyfius/voorbeeld/

Heb voor iemand op IRC daar een voorbeeldje gemaakt tijdje terug.

Basicly maak ik een Persoon aan, en een Persoon heeft een Adres. Een Adres heeft een huisnummer, maar omdat dit een huisnummer tot de primitieve types behoort (hiermee bedoel ik int, float, double) moet ik die niet expliciet verwijderen in de destructor. In Persoon moet ik daarentegen WEL zelf adres verwijderen.

hoe zit het eigenlijk wanneer het adress niet via een pointer wordt voorgesteld? moet ge dan nog expliciet die delete oproepen in de destructor of gebeurt dat automatisch (ik dacht automatisch) ? mijn c++ is nogal rusty voor de moment en kvroeg het mij af..

Tyfius

Legacy Member
Goei vraag, I'll get back to you on that :p
Da is ook maar C++ van meer dan een jaar geleden, tegenwoordig is het hier alleen nog maar C#. Kwas al blij da het toen van de 1ste keer compilde zonder errors :p

IceSkull[BE]

Legacy Member
thx voor de uitleg gasten.. begin ze te snappen.. ma ter zijn glijk 2 maniere om variabelen te maken, en wel als volgt:

int MyValue = 5;
int* pMyValue = new int(5);

wa is het verschil tussen deze 2.. is er voor die 5 bij het tweede geen variablenaam? moet ik daar dan direct pointers gaan gebruiken?

killgore

Legacy Member
Hale zei:
hoe zit het eigenlijk wanneer het adress niet via een pointer wordt voorgesteld? moet ge dan nog expliciet die delete oproepen in de destructor of gebeurt dat automatisch (ik dacht automatisch) ? mijn c++ is nogal rusty voor de moment en kvroeg het mij af..
delete in destructor moe gij expliciet nog oproepen, ge moet gewoon uw adress nie meer expliciet deleten en zo zijn destructor oproepen.

Hale

Legacy Member
confused-mode :

hoe bedoelt ge juist ? ge moet idd nog de destructor van Persoon oproepen, en wa moet er in die destructor staan ? :

~Persoon(){
delete this->adress;
}

of

~Persoon(){}

?

killgore

Legacy Member
Hale zei:
confused-mode :

hoe bedoelt ge juist ? ge moet idd nog de destructor van Persoon oproepen, en wa moet er in die destructor staan ? :

~Persoon(){
delete this->adress;
}

of

~Persoon(){}

?
ow, srry, kwist nie da ge binnen persoon bedoelde :p.

als het is

Code:
Adres adress
moet er niets in uw destructor staan
als het is
Code:
Adres *adress;
ist zoiets:
in constructor:
Code:
adress = new Adres(...);
of (als ge niet onmiddelijk wilt aanmaken)
Code:
adress = NULL;
in destructor:
Code:
delete adress;

forloRn_

Legacy Member
IceSkull[BE] zei:
thx voor de uitleg gasten.. begin ze te snappen.. ma ter zijn glijk 2 maniere om variabelen te maken, en wel als volgt:

int MyValue = 5;
int* pMyValue = new int(5);

wa is het verschil tussen deze 2.. is er voor die 5 bij het tweede geen variablenaam? moet ik daar dan direct pointers gaan gebruiken?

Ik ben geen C++-expert aangezien ik er nog maar een drietal maanden mee bezig ben, maar ik zal zal proberen.

In Java bijvoorbeeld komen objecten automatisch op de heap terecht, en primitieven op de stack. In C++ kan je kiezen waar je die dingen plaatst. Wat de stack en de heap precies zijn, kan iemand anders beter uitleggen, ik schets gewoon even de gevolgen.

int MyValue = 5; creëert een integer op de stack. De plaats in het geheugen waar de variabele MyValue mee overeenkomt, bevat effectief de, laten we zeggen 32, bits van een integer. Een gevolg van het declareren van een variabele op de stack is dat het geheugen (die 32 bits) automatisch vrijgegeven worden als de scope van de variabele eindigt (in de meeste gevallen is dat op het einde van een method).

int* pMyValue = new int(5); creëert een integer op de heap. De plaats in het geheugen waar pMyValue mee overeenkomt, bevat een pointer naar de 32 bits van de integer. In tegenstelling tot een integer op de stack, wordt het geheugen van de integer niet vrijgegeven op het einde van de method. Het geheugen van de pointer wel, maar die is dan ook op de stack gecreëerd. :)

Het voordeel van dingen creëren op de heap? Ze leven langer. Het nadeel: je moet ze zelf opruimen met delete.

In sommige gevallen ben je trouwens genoodzaakt om je toevlucht te zoeken tot de heap: wanneer je polymorfisme toepast kan er een fenomeen optreden dat slicing heet, maar daar ga ik je niet mee lastigvallen.

Hale

Legacy Member
killgore zei:
ow, srry, kwist nie da ge binnen persoon bedoelde :p.

als het is

Code:
Adres adress
moet er niets in uw destructor staan
als het is
Code:
Adres *adress;
ist zoiets:
in constructor:
Code:
adress = new Adres(...);
of (als ge niet onmiddelijk wilt aanmaken)
Code:
adress = NULL;
in destructor:
Code:
delete adress;


zoals ik dacht dus :)

killgore

Legacy Member
forloRn_ zei:
Ik ben geen C++-expert aangezien ik er nog maar een drietal maanden mee bezig ben, maar ik zal zal proberen.

In Java bijvoorbeeld komen objecten automatisch op de heap terecht, en primitieven op de stack. In C++ kan je kiezen waar je die dingen plaatst. Wat de stack en de heap precies zijn, kan iemand anders beter uitleggen, ik schets gewoon even de gevolgen.

int MyValue = 5; creëert een integer op de stack. De plaats in het geheugen waar de variabele MyValue mee overeenkomt, bevat effectief de, laten we zeggen 32, bits van een integer. Een gevolg van het declareren van een variabele op de stack is dat het geheugen (die 32 bits) automatisch vrijgegeven worden als de scope van de variabele eindigt (in de meeste gevallen is dat op het einde van een method).

int* pMyValue = new int(5); creëert een integer op de heap. De plaats in het geheugen waar pMyValue mee overeenkomt, bevat een pointer naar de 32 bits van de integer. In tegenstelling tot een integer op de stack, wordt het geheugen van de integer niet vrijgegeven op het einde van de method. Het geheugen van de pointer wel, maar die is dan ook op de stack gecreëerd. :)

Het voordeel van dingen creëren op de heap? Ze leven langer. Het nadeel: je moet ze zelf opruimen met delete.

In sommige gevallen ben je trouwens genoodzaakt om je toevlucht te zoeken tot de heap: wanneer je polymorfisme toepast kan er een fenomeen optreden dat slicing heet, maar daar ga ik je niet mee lastigvallen.
mssch te verduidelijking: het is niet omdat je met pointers werkt dat je noodzakelijk op de heap werkt!!!

bv.
int getal=5;
int* pointer_naar_getal = &getal;

in dit geval wijst pointer_naar_getal naar een stack element en is het dus niet noodzakelijk delete op te roepen.

Delete moet je enkel oproepen voor geheugen dat jij hebt aangemaakt via new of een allocatie-functie.

forloRn_

Legacy Member
Juist, maar ik heb ook nooit beweerd dat je altijd delete moet toepassen op pointers:

mezelf zei:
Het voordeel van dingen creëren op de heap? Ze leven langer. Het nadeel: je moet ze zelf opruimen met delete.

:p

killgore

Legacy Member
forloRn_ zei:
Juist, maar ik heb ook nooit beweerd dat je altijd delete moet toepassen op pointers:
nee, er stond dan ook "ter verduidelijking:", niet "srry, maar dat is niet volledig correct:".

Psychokillah

Legacy Member
misschien ook handig als truucje:
- zaken op de stack worden verwijderd als je uit scope gaat
- zaken op de heap niet die moet je expliciet deleten

Tis maar hoe je het verwoordt he :D

CyBeRRaT

Legacy Member
misschien nog veel beter om te weten:
vermijd pointers!
zeker in dit geval is dat absoluut niet nodig (persoon-adres) het wordt zelfs gezien als slechte stijl!

wat je hier nodig hebt is compositie. maw:
Code:
class Persoon
{
private:
  Adress adres_van_mijn_persoon
  //andere variabelen, functies...
}

echt waar, gebruik pointers ENKEL als je niet anders kan!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan