User Tools

Site Tools


cpp:object_creation

This is an old revision of the document!


Δημιουργία αντικειμένων

Η δημιουργία αντικειμένων γίνεται με κλήση του αντίστοιχου κατασκευαστή ως εξής:

Rectangle.cpp
#include <iostream>
using namespace std;
 
class Rectangle {
  private:
    int width, height;
  public:
    Rectangle(int w, int h);
    Rectangle(int s);
    Rectangle();
    int getWidth() const;
    int getHeight() const;
    void setWidth(int w);
    void setHeight(int h);
};
 
Rectangle::Rectangle(int w, int h): width(w), height(h) {}
Rectangle::Rectangle(int s) : width(s), height(s) {}
Rectangle::Rectangle(): width(0), height(0) {}
 
int Rectangle::getWidth() const { return width;}
int Rectangle::getHeight() const { return height;}
void Rectangle::setWidth(int w) { width = w; }
void Rectangle::setHeight(int h) { height = h; }
 
int main() {
  Rectangle rect1(3,4);
  Rectangle rect2(5);
  Rectangle rect3;
}

Ο παραπάνω κώδικας δημιουργεί 3 αντικείμενα της κλάσης Rectangle το αντικείμενο rect1 με πλευρές 3 και 4, το rect2 με πλευρές κοινού μήκους 5 και το αντικείμενο rect3 που έχει μηδενικές τιμές.

Παρατηρήστε ότι για το τελευταίο αντικείμενο δεν χρησιμοποιούνται παρενθέσεις κατά την κλήση του καστασκευαστή, όπως πιθανόν θα περιμένατε

Rectangle rect3();

Η χρήση παρενθέσεων δεν είναι απαραίτητη, αλλά ούτε και λανθασμένη (έκδοση g++ 7.x.x)

Εναλλακτικοί τρόποι κλήσης του κατασκευαστή της κλάσης

Εκτός από την χρήση παρενθέσεων για την κλήση του καστασκευαστή της κλάσης όταν αυτός έχει ορίσματα υπάρχουν οι παρακάτω επιπλέον τρόποι κλήσης κατασκευαστών:

1. Κατασκευαστές με μόνο μία παράμετρο

Στην περίπτωση που έχουμε μόνο μία παράμετρο μπορούμε να καλέσουμε τον κατασκευαστή της κλάσης με χρήση του τελεστή ίσον ('=') ως εξής:

class_name object_name = initialization_value;

Για παράδειγμα, για την κλάση Rectangle στη συνάρτηση main μπορείτε να γράψετε

int main () {
  Rectangle rect=5;
  cout << "area: " << rect.getWidth() * rect.getHeight() << endl;
  return 0;
}

Σε αυτή την περίτπωση καλείται ο κατασκευαστής που έχει ένα μόνο όρισμα το οποίο λαμβάνει την τιμή 5. Το εμβαδό του παραλληλογράμμου που εκτυπώνεται είναι 25 (5×5).

2. Χρήση αγκίστρων αντί για παρενθέσεις

Η C++ δίνει την δυνατότητα χρήσης αγκίστρων αντί για παρενθέσεις προκειμένου να καλέσουμε τον κατασκευαστή της κλάσης. Ο τρόπος αυτός έχει τις εξής δύο παραλαγές:

Σε αναλογία με τη χρήση παρενθέσεων
int main () {
  Rectangle rect {5,6}; // calls Rectangle(int w, int h)
  cout << "area: " << rect.getWidth() * rect.getHeight() << endl;
  return 0;
}

Καλείται ο κατασκευαστής της κλάσης με δύο ορίσματα (width=5, height=6).

Με χρήση του τελεστή = πριν τα άγκιστρα
RectangleInitialization.cpp
int main () {
  Rectangle rect = {5,6};              // καλεί Rectangle(int w, int h)
  Rectangle rects[2] = {{4,5}, {5,6}}; // καλεί Rectangle(int w, int h) για κάθε θέση του πίνακα
  cout << "[rect    ] area: " << rect.getWidth() * rect.getHeight() << endl;
  cout << "[rects[0]] area: " << rects[0].getWidth() * rects[0].getHeight() << endl;
  cout << "[rects[1]] area: " << rects[1].getWidth() * rects[1].getHeight() << endl;
  return 0;
}

Οι παραπάνω δύο τρόποι είναι ισοδύναμοι εάν πρόκειται να αρχικοποιήσουμε ένα μεμονομένο αντικείμενο. Στην περίπτωση που θέλουμε να αρχικοποιήσουμε πίνακες από αντικείμενα, μόνο η χρήση του τελεστή ίσον ('=') πριν από τα άγκιστρα επιτρέπει την παραπάνω αρχικοποίηση σε μία εντολή.

cpp/object_creation.1586354157.txt.gz · Last modified: 2020/04/08 12:55 (external edit)