Differences
This shows you the differences between two versions of the page.
| Next revisionBoth sides next revision |
cpp:copy_constructors [2017/04/20 10:13] – created gthanos | cpp:copy_constructors [2017/04/20 11:22] – gthanos |
---|
====== Κατασκευαστές Αντιγραφείς ====== | ====== Κατασκευαστές Αντιγραφείς ====== |
| |
Στην ενότητα των συναρτήσεων είδαμε [[cpp:functions#κλήση_με_τιμή_και_κλήση_με_αναφορά|την κλήση με τιμή και κλήση με αναφορά]] προκειμένου να περάσουμε παραμέτρους σε μία συνάρτηση. Κατά την κλήση με τιμή όταν η παράμετρος είναι ένα αντικείμενο, ένα αντίγραφο του αντικειμένου θα πρέπει να δημιουργηθεί στο //stack// της συνάρτησης που καλείται. Προκειμένου να γίνει αυτό η C++ ορίζει την έννοια του κατασκευαστή αντιγραφέα ο οποίος έχει την δυνατότητα να δημιουργήσει ένα αντικείμενο που είναι ακριβές αντίγραφο ενός άλλου αντικειμένου. Δείτε το παρακάτω παράδειγμα της μεθόδου //foo// η οποία λαμβάνει ένα αντικείμενο της κλάσης //Rectangle//. | Στην ενότητα των συναρτήσεων είδαμε [[cpp:functions#κλήση_με_τιμή_και_κλήση_με_αναφορά|την κλήση με τιμή και κλήση με αναφορά]] προκειμένου να περάσουμε παραμέτρους σε μία συνάρτηση. Κατά την κλήση με τιμή όταν η παράμετρος είναι ένα αντικείμενο, ένα αντίγραφο του αντικειμένου θα πρέπει να δημιουργηθεί στο //stack// της συνάρτησης που καλείται. Προκειμένου να γίνει αυτό η C++ ορίζει την έννοια του κατασκευαστή αντιγραφέα ο οποίος έχει την δυνατότητα να δημιουργήσει ένα αντικείμενο που είναι ακριβές αντίγραφο ενός άλλου αντικειμένου. Δείτε το παρακάτω παράδειγμα της μεθόδου //printArea// η οποία λαμβάνει ως παράμετρο ένα αντικείμενο της κλάσης //Rectangle//. |
| |
| <code cpp 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); |
| } |
| </code> |
| |
| Παρακάτω δίνεται το σχηματικό διάγραμμα της στοίβας της διεργασίας πριν και κατά τη διάρκεια της κλήσης της μεθόδου //printArea//. Διακρίνεται η αντιγραφή του αντικειμένου //rect// στη στοίβα της //printArea// κατά την κλήση της. |
| |
| {{ :cpp:cppstackcopyconstructor.png |}} |
| |
| |
| |