User Tools

Site Tools


cpp:copy_constructors

This is an old revision of the document!


Κατασκευαστές Αντιγραφείς

Στην ενότητα των συναρτήσεων είδαμε την κλήση με τιμή και κλήση με αναφορά προκειμένου να περάσουμε παραμέτρους σε μία συνάρτηση. Κατά την κλήση με τιμή όταν η παράμετρος είναι ένα αντικείμενο, ένα αντίγραφο του αντικειμένου θα πρέπει να δημιουργηθεί στο 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; }
cpp/copy_constructors.1492688664.txt.gz · Last modified: 2017/04/20 10:44 (external edit)