User Tools

Site Tools


cpp:destructors

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
cpp:destructors [2020/04/08 10:34] – created gthanoscpp:destructors [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
 ===== Καταστροφείς της κλάσης ===== ===== Καταστροφείς της κλάσης =====
  
-Σε αναλογία με τον κατασκευαστή της κλάσης η C++ δηλώνει και τον καταστροφέα της κλάσης. Ο καταστροφέας της κλάσης επιτρέπει να γίνουν οι απαραίτητες εργασίες καθαρισμού για το αντικείμενο που καταστρέφεται. Για παράδειγμα είναι πιθανόν κατά την δημιουργία του αντικειμένου να έχει δεσμευθεί μνήμη την οποία πρέπει να ελευθερώσουμε ή να έχουν ανοιχθεί αρχεία τα οποία κατά την καταστροφή του αντικειμένου πρέπει να τα κλείσουμε. +Εκτός από τον κατασκευαστή μίας κλάσης, στη C++ έχουμε τη δυνατότητα (και συχνά οφείλουμε) να ορίσουμε και τον καταστροφέα της. Ο καταστροφέας καλείται κατά την καταστροφή του αντικειμένου, ώστε να γίνουν οι απαραίτητες εργασίες "καθαρισμού". Για παράδειγμαείναι πιθανόν κατά την δημιουργία του αντικειμένου στον κατασκευαστή να έχει δεσμευθεί μνήμη την οποία κατά την καταστροφή του πρέπει να ελευθερώσουμε. Επιπλέον, μπορεί να έχουν ανοιχθεί στον κατασκευαστή αρχεία ή άλλοι πόροι του συστήματος τα οποία κατά την καταστροφή του αντικειμένου πρέπει να τα κλείσουμε. Στη διεθνή βιβλιογραφία ο καταστροφέας της κλάσης απαντάται ως //destructor//.
  
-Στο παρακάτω παράδειγμα βλέπετε την κλάση //Rectangle// όπου τα πεδία width και height είναι δείκτες. Σε αυτή την περίπτωση θα πρέπει να δεσμεύουμε την απαραίτητη μνήμη με χρήση του τελεστή new. Στον καταστροφέα την κλάσης απελευθερώνουμε τη μνήμη που δεσμεύσαμε προηγούμενα.+Στο παρακάτω παράδειγμα βλέπετε την κλάση //Rectangle// όπου τα πεδία width και height είναι δείκτες σε ακέραιο και όχι ακέραιοι. Σε αυτή την περίπτωση θα πρέπει να δεσμεύουμε την απαραίτητη μνήμη με χρήση του τελεστή new στον κατασκευαστή, ενώ στον καταστροφέα την κλάσης απελευθερώνουμε τη μνήμη που δεσμεύσαμε προηγούμενα.
  
-<code cpp Rectangle.cpp>+<code cpp Rectangle.hpp>
 #include <iostream> #include <iostream>
 #include <cstdlib> #include <cstdlib>
Line 12: Line 12:
 class Rectangle { class Rectangle {
   private:   private:
-    int *width*height;+    int* width
 +    int* height;
   public:   public:
     Rectangle(int w, int h);     Rectangle(int w, int h);
Line 21: Line 22:
     int getHeight();     int getHeight();
 }; };
 +</code>
 +
 +<code cpp Rectangle.cpp>
 +#include "Rectangle.hpp"
  
 Rectangle::Rectangle(int w, int h) { Rectangle::Rectangle(int w, int h) {
Line 43: Line 48:
 int Rectangle::getWidth() { return *width; } int Rectangle::getWidth() { return *width; }
 int Rectangle::getHeight() { return *height; } int Rectangle::getHeight() { return *height; }
 +</code>
 +
 +<code cpp RectangleUsage.cpp>
 +#include "Rectangle.hpp"
  
 int main () { int main () {
Line 51: Line 60:
 </code> </code>
  
 +Στο παραπάνω παράδειγμα, εάν δεν οριστεί καταστροφέας η μνήμη θα παραμείνει δεσμευμένη μέχρι να τερματιστεί το πρόγραμμα και η μνήμη να ελευθερωθεί από το λειτουργικό μαζί με όλους τους πόρους του προγράμματος. Σε αυτή την περίπτωση το πρόγραμμα κατά την εκτέλεση του δεν απελευθερώνει τη μνήμη που δέσμευσε.
  
  
  
cpp/destructors.1586342071.txt.gz · Last modified: 2020/04/08 09:34 (external edit)