User Tools

Site Tools


cpp:copy_constructors

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
cpp:copy_constructors [2018/05/07 07:07] – [Κατασκευαστές Αντιγραφείς] gthanoscpp:copy_constructors [2019/03/06 20:08] – [Δημιουργία κατασκευαστών αντιγραφέων] gthanos
Line 27: Line 27:
  
 <code cpp> <code cpp>
-Rectangle::Rectangle(Rectangle &r) {+Rectangle::Rectangle(const Rectangle &r) {
   width = r.width; height = r.height;   width = r.width; height = r.height;
 } }
 </code> </code>
  
-Συνολικά η κλάση //Rectangle// διαμορφώνεται ως εξής:+Η μεταβλητή //r// δηλώνεται ως //const// διότι κατά την εκτέλεση του κατασκευαστή το αντικείμενο //r// δεν θα μεταβληθεί. Συνολικά η κλάση //Rectangle// διαμορφώνεται ως εξής:
  
 <code cpp Rectangle.cpp> <code cpp Rectangle.cpp>
Line 217: Line 217:
 Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//. Ισχύουν επομένως τα εξής: Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//. Ισχύουν επομένως τα εξής:
   * Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2//   * Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2//
-  * Κατά την έξοδο από τη συνάρτηση main, το αντικείμενο //r1// θα καταστραφεί ελευθερώνοντας τη δεσμευμένη μνήμη για το πεδίο του //origin//. Η προσπάθεια καταστρροφής του αντικειμένου //r2// θα οδηγήσει σε σφάλμα διότι θα προσπαθήσει να ελευθερώσει μία περιοχή μνήμης που έχει ήδη ελευθερωθεί κατά την καταστροφή του //r1//. Το σφάλμα που εκτυπώνεται όταν το πρόγραμμα μεταγλωττιστεί με //g++// είναι το εξής:+  * Κατά την έξοδο από τη συνάρτηση main, το αντικείμενο //r1// θα καταστραφεί ελευθερώνοντας τη δεσμευμένη μνήμη για το πεδίο του //origin//. Η προσπάθεια καταστρροφής του αντικειμένου //r2// θα οδηγήσει σε σφάλμα διότι θα προσπαθήσει να ελευθερώσει μία περιοχή μνήμης που έχει ήδη ελευθερωθεί κατά την καταστροφή του //r1//. Το σφάλμα που εκτυπώνεται όταν το πρόγραμμα εκτελεστεί είναι το εξής:
  
 <code> <code>
Line 226: Line 226:
 Για να αποφύγετε την παραπάνω συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής: Για να αποφύγετε την παραπάνω συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής:
   - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//.   - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//.
-  - Αντιγράφει τα περιεχόμενα του παλιού στο νέο.+  - Αντιγράφει τα περιεχόμενα του παλιού αντικειμένου στο νέο.
  
 Ο προτεινόμενος κατασκευαστής αντιγραφέας δίνεται παρακάτω: Ο προτεινόμενος κατασκευαστής αντιγραφέας δίνεται παρακάτω:
cpp/copy_constructors.txt · Last modified: 2022/05/12 19:41 by gthanos