User Tools

Site Tools


cpp:object_creation

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
cpp:object_creation [2020/04/08 14:30]
gthanos ρε
cpp:object_creation [2021/05/07 06:22]
Line 1: Line 1:
-====== Δημιουργία αντικειμένων ====== 
- 
-Η δημιουργία αντικειμένων γίνεται με κλήση του αντίστοιχου κατασκευαστή ως εξής: 
-<code c++ Rectangle.hpp> 
-#include <iostream> 
-using namespace std; 
- 
-class Rectangle { 
-  private: 
-    int width, height; 
-  public: 
-    Rectangle(int w, int h); 
-    Rectangle(int s); 
-    Rectangle(); 
-    ~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) {} 
- 
-Rectangle::~Rectangle() { 
-  std::cout << "Rectangle destructor!\n"; 
-} 
- 
-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; } 
- 
-</code> 
- 
-<code cpp RectangleUsage.cpp> 
-int main() { 
-  Rectangle rect1(3,4); 
-  Rectangle rect2(5); 
-  Rectangle rect3; 
-} 
-</code> 
- 
-Ο παραπάνω κώδικας δημιουργεί 3 αντικείμενα της κλάσης //Rectangle// το αντικείμενο //rect1// με πλευρές 3 και 4, το //rect2// με πλευρές κοινού μήκους 5 και το αντικείμενο //rect3// που έχει μηδενικές τιμές.  
- 
-<WRAP center round tip 80%> 
-Παρατηρήστε ότι για το τελευταίο αντικείμενο δεν χρησιμοποιούνται παρενθέσεις κατά την κλήση του καστασκευαστή, όπως πιθανόν θα περιμένατε 
-<code c++> 
-Rectangle rect3(); 
-</code>  
-Η χρήση παρενθέσεων δεν είναι απαραίτητη, αλλά ούτε και λανθασμένη (έκδοση g++ 7.x.x) 
-</WRAP> 
- 
-===== Εναλλακτικοί τρόποι κλήσης του κατασκευαστή της κλάσης ===== 
- 
-Εκτός από την χρήση παρενθέσεων για την κλήση του καστασκευαστή της κλάσης όταν αυτός έχει ορίσματα υπάρχουν οι παρακάτω επιπλέον τρόποι κλήσης κατασκευαστών: 
- 
-=== 1. Κατασκευαστές με μόνο μία παράμετρο === 
- 
-Στην περίπτωση που έχουμε μόνο μία παράμετρο μπορούμε να καλέσουμε τον κατασκευαστή της κλάσης με χρήση του τελεστή ίσον ('=') ως εξής: 
-<code>class_name object_name = initialization_value;</code> 
-Για παράδειγμα, για την κλάση //Rectangle// στη συνάρτηση //main// μπορείτε να γράψετε  
-<code c++> 
-int main () { 
-  Rectangle rect=5; 
-  cout << "area: " << rect.getWidth() * rect.getHeight() << endl; 
-  return 0; 
-} 
-</code> 
- 
-Σε αυτή την περίτπωση καλείται ο κατασκευαστής που έχει ένα μόνο όρισμα το οποίο λαμβάνει την τιμή 5. Το εμβαδό του παραλληλογράμμου που εκτυπώνεται είναι 25 (5x5). 
- 
-=== 2. Χρήση αγκίστρων αντί για παρενθέσεις === 
- 
-Η C++ δίνει την δυνατότητα χρήσης αγκίστρων αντί για παρενθέσεις προκειμένου να καλέσουμε τον κατασκευαστή της κλάσης. Ο τρόπος αυτός έχει τις εξής δύο παραλαγές: 
- 
-== Σε αναλογία με τη χρήση παρενθέσεων == 
- 
-<code c++> 
-int main () { 
-  Rectangle rect {5,6}; // calls Rectangle(int w, int h) 
-  cout << "area: " << rect.getWidth() * rect.getHeight() << endl; 
-  return 0; 
-} 
-</code> 
- 
-Καλείται ο κατασκευαστής της κλάσης με δύο ορίσματα (//width=5, height=6//). 
- 
-== Με χρήση του τελεστή = πριν τα άγκιστρα == 
- 
-<code c++ 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; 
-} 
-</code> 
- 
-Οι παραπάνω τρόποι είναι ισοδύναμοι εάν πρόκειται να αρχικοποιήσουμε ένα μεμονομένο αντικείμενο. Στην περίπτωση που θέλουμε να αρχικοποιήσουμε πίνακες από αντικείμενα, μόνο η χρήση του τελεστή ίσον ('=') πριν από τα άγκιστρα επιτρέπει την παραπάνω αρχικοποίηση σε μία εντολή. 
- 
-===== Δημίουργία αντικείμένων στο Heap ===== 
- 
-Τα παραδείγματα που είδαμε μέχρι τώρα δημιουργούν αντικείμενα μέσα στο //stack// της διεργασίας. Εάν θέλουμε να δημιουργήσουμε αντικείμενα τα οποία είναι αποθηκευμένα στο //heap//, δηλαδή δεσμεύεται δυναμικά μνήμη για αυτά, θα πρέπει να το κάνουμε μέσω του τελεστή [[cpp:dynamic_memory|**new** που είδαμε προηγούμενα]] ως εξής: 
- 
-<code cpp RectangleInitialization.cpp> 
-int main () { 
-  Rectangle *rect;       
-  rect = new Rectangle(5,6);  // Δέσμευση της μνήμης για ένα αντικείμενο τύπου Rectangle 
-                              // και αρχικοποίηση του με τιμές width=5, height=6. 
-  /*  
-   * do fancy things here... 
-   */ 
- 
-  delete rect;                // Απελευθέρωση της μνήμης που δεσμεύτηκε προηγούμενα.  
-                              // Καλείται ο καταστροφέας της κλάσης εάν υπάρχει. 
-  return 0; 
-} 
-</code> 
- 
-Όταν ολοκληρωθεί ο κύκλος ζωής του αντικειμένου θα πρέπει να διαγραφεί το αντικείμενο μέσω του τελεστή //delete//. Η χρήση του τελεστή //delete// καλεί πριν την καταστροφή του αντικειμένου τον καταστροφέα της κλάσης. 
  
cpp/object_creation.txt · Last modified: 2021/05/07 06:22 (external edit)