This is an old revision of the document!
Table of Contents
Κατασκευαστές Αντιγραφείς
Στην ενότητα των συναρτήσεων είδαμε την κλήση με τιμή και κλήση με αναφορά προκειμένου να περάσουμε παραμέτρους σε μία συνάρτηση. Κατά την κλήση με τιμή όταν η παράμετρος είναι ένα αντικείμενο, ένα αντίγραφο του αντικειμένου θα πρέπει να δημιουργηθεί στο stack της συνάρτησης που καλείται. Προκειμένου να γίνει αυτό η C++ ορίζει την έννοια του κατασκευαστή αντιγραφέα (copy constructor), ο οποίος δημιουργεί ένα αντικείμενο που είναι ακριβές αντίγραφο ενός άλλου αντικειμένου. Δείτε το παρακάτω παράδειγμα της μεθόδου printArea η οποία λαμβάνει ως παράμετρο ένα αντικείμενο της κλάσης Rectangle.
- foo.cpp
#include <iostream> using namespace std; #include "Rectangle.cpp" void printArea(Rectangle r) { cout << " area: " << r.getArea() << endl; } int main() { Rectangle rect(5,6); printArea(rect); }
Παρακάτω δίνεται το σχηματικό διάγραμμα της στοίβας της διεργασίας πριν και κατά τη διάρκεια της κλήσης της μεθόδου printArea. Κατά την κλήση της συνάρτησης printArea, διακρίνεται η αντιγραφή του αντικειμένου rect στη μεταβλητή r που ανήκει στη στοίβα της printArea.
Ορισμός ενός κατασκευαστή αντιγραφέα
Ένας κατασκευαστής αντιγραφέας για την κλάση Rectangle ορίζεται ως εξής:
Rectangle::Rectangle(Rectangle &r) { width = r.width; height = r.height; }
Συνολικά η κλάση Rectangle διαμορφώνεται ως εξής:
- Rectangle.cpp
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; class Rectangle { private: int width, height; public: Rectangle(int w, int h); Rectangle(int s); Rectangle(); void setWidth(int w); void setHeight(int h); int getWidth(); int getHeight(); }; Rectangle::Rectangle(int w, int h) { width = w; height = h; } Rectangle::Rectangle(int s) { width = s; height = s; } Rectangle::Rectangle() { srand(time(NULL)); width = rand() % 10 + 1; height = rand() % 10 + 1; } // copy constructor Rectangle::Rectangle(Rectangle &r) { width = r.width; height = r.height; } void Rectangle::setWidth(int w) { width = w; } void Rectangle::setHeight(int h) { height = h; } int Rectangle::getWidth() { return width; } int Rectangle::getHeight() { return height; }