ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

Σχετικά έγγραφα
Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Τελεστές ΤΕΛΕΣΤΕΣ. Γεώργιος Παπαϊωάννου ( )

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

Κλάσεις και αντικείμενα #include <iostream.h<

12. ΑΛΦΑΡΙΘΜΗΤΙΚΑ. υο είδη αλφαριθµητικών Τα αλφαριθµητικά της C πίνακες τύπου char Ta αντικείµενα της κλάσης string

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Εισαγωγή στον Προγραμματισμό με C++

Υπερφόρτωση τελεστών

Αντικειμενοστρεφής Προγραμματισμός

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΚΑΙ ΠΟΛΥΜΟΡΦΙΣΜΟΣ

Ενδεικτικές Λύσεις σε Επιλεγμένα Θέματα της C++

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Εργαστήριο 10 Κλάσεις

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Αντικειμενοστραφής Προγραμματισμός

Απάντηση. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)?

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++

Αντικειµενοστρεφής Προγραµµατισµός

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κλάσεις και Αντικείµενα

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Ανάπτυξη και Σχεδίαση Λογισμικού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Αναφορές, είκτες και Αλφαριθμητικά

Δομημένος Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Copy Constructor Deep and Shallow Copies

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Εργαστήριο 2: Πίνακες

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

Αρχεία Κεφαλίδων ΑΡΧΕΙΑ ΚΕΦΑΛΙΔΩΝ. Γεώργιος Παπαϊωάννου ( )

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

3 Αλληλεπίδραση Αντικειμένων

Προχωρημένα Θέματα ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ. Γεώργιος Παπαϊωάννου ( )

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Υπολογιστών με C++

Οντοκεντρικός Προγραμματισμός

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

Εισαγωγή στον Προγραμματισμό

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Τι είναι κλάση Κλάση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Copy Constructor Deep and Shallow Copies

Προγραμματιστικές τεχνικές

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Copy Constructor Deep and Shallow Copies

Ερωτήσεις και απαντήσεις στα θέματα του κανονισμού κατάρτισης

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

POINTERS, AGGREGATION, COMPOSITION

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Copy Constructor Deep and Shallow Copies

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι ; Συναρτήσεις. Παράδειγμα #1. double convert ( double cm ) { double inch;

Διαδικασιακός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Στοιχειώδης προγραμματισμός σε C++

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα προηγούμενα ακαδημαϊκά έτη: ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Transcript:

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr

Περιγραφή: Deep/Shallow copies H αναγκαιότητα των κατασκευαστών αντιγραφής Ορισμός και χρήση κατασκευαστών αντιγραφής Τελευταία ενημέρωση: Νοέμβριος 2016 Εισαγωγή - 2

Όσο οι κλάσεις μας γίνονται ολοένα και πιο πολύπλοκες, συχνά χρειάζεται να φυλάμε πεδία τύπου δείκτη σε δεδομένα που έχουν εκχωρηθεί στο σωρό ή συλλογές αντικειμένων Όταν δημιουργούμε ένα αντίγραφο ενός αντικειμένου, πρέπει να αντιγράψουμε όλα του τα πεδία στο νέο αντικείμενο Σε τι βάθος όμως προχωράμε την αντιγραφή; Ποιος είναι υπεύθυνος για την υλοποίηση αυτής της αντιγραφής; Μια εξωτερική συνάρτηση; Μια μέθοδος που προσδιορίζεται από εμάς; 3

Όταν το περνάμε «κατά τιμή» σε μια συνάρτηση Όταν το αναθέτουμε σε μια μεταβλητή ως τιμή επιστροφής από μια συνάρτηση (εκτός αν είναι επιστροφή αναφοράς) Όταν καλούμε μια μη υπερφορτωμένη ανάθεση με τον τελεστή = Όταν δημιουργούμε ένα νέο αντικείμενο περνώντας στον κατασκευαστή του ένα υπάρχον ίδιου τύπου Δηλαδή εξαιρετικά συχνά! 4

class Array { float * buffer; int size; public: Array(int items) { size = items; buffer = new float[items]; Array() : size(0), buffer(nullptr) { ~Array() { if (buffer) delete[] buffer; float& operator[](int index) { int i = index>size-1?size-1:index<0?0:index; return (buffer[i]); ; 5

void main(int argc, char* argv[]) { Array a1(4); a1[0] = 1.f; Array a2 = a1; a2[0] = 2.f; Αντιγραφή του αντικειμένου Array a3(a2); a3[0] = 3.f; cout << a1[0] << << a2[0] << << a3[0] ; // Τυπώνει 3 3 3 αντί για 1 2 3!! 6

Που βρίσκεται το πρόβλημα; Κατά την αντιγραφή του αντικειμένου, αντιγράφονται όλα τα πεδία του, προφανώς κατά τιμή, έστω κι αν είναι δείκτες: 0x0060 0x0064 0x0068 0x006C &a1[0]==&a2[0]==&a3[0]==0x0060 3.0f??? Array a1 buffer=0x0060 size=4 Array a2 buffer=0x0060 size=4 Array a3 buffer=0x0060 size=4 αντιγραφή αντιγραφή 7

Εδώ έγινε μια «ρηχή» αντιγραφή των πεδίων, ενώ στη συγκεκριμένη περίπτωση θα θέλαμε να είναι «βαθιά», δηλαδή να αντιγραφούν και τα περιεχόμενα των δεικτών ή αναφορών Αυτό δεν ισχύει πάντα και εξαρτάται από το συγκεκριμένο πρόβλημα που πάμε να λύσουμε: Για παράδειγμα αν μια κλάση φυλάει ένα δείκτη σε μια άλλη κλάση που υλοποιεί ένα μοναδικό στιγμιότυπο ενός web service, δε θέλουμε κάθε φορά να παράγουμε και ένα πλήρες αντίγραφό του 8

Στο παράδειγμά μας έχουμε και ένα δεύτερο πρόβλημα: Τι θα γίνει όταν κληθούν οι καταστροφείς των 3 αντικειμένων; Ο πρώτος θα κληθεί επιτυχώς Οι επόμενοι θα αποτύχουν γιατί θα προσπαθήσουν να αποδεσμεύσουν μνήμη που έχει ήδη αποδεσμευθεί!! 9

Ποιος πραγματοποιεί αυτή την αντιγραφή; Ένας ειδικός κατασκευαστής, που ονομάζεται κατασκευαστής αντιγραφής Αν δεν τον ορίσουμε, ο μεταγλωττιστής τον παράγει αυτόματα Δημιουργεί ένα νέο αντικείμενο που να είναι αντίγραφο ενός άλλου, ίδιου τύπου Το πρόβλημα είναι ότι το τί σημαίνει «αντίγραφο» δε μπορεί να το γνωρίζει ο μεταγλωττιστής πάντα (όπως στην περίπτωση που είδαμε) 10

Γι αυτό το λόγο, συχνά απαιτείται να ορίζουμε εμείς τον κατασκευαστή αντιγραφής μιας κλάσης ώστε να έχουμε πλήρη έλεγχο του τι συμβαίνει: Προσδιορίζουμε για ποια πεδία χρειάζεται deep copy Ο κατασκευαστής αντιγραφής, για μεγάλα αντικείμενα ενδέχεται να εκτελεί πολλές πράξεις και πιθανά να αντιγράφει πεδία που δε χρειάζεται: βοηθητικά πεδία πεδία που θα επαναπροσδιοριστούν έτσι κι αλλιώς στο νέο αντικείμενο μετά την κατασκευή Μπορούμε να τα εξαιρέσουμε από την αντιγραφή, γλυτώνοντας πόρους 11

class Array { float * buffer; int size; public: Array(int items) { size = items; buffer = new float[items]; Array() : size(0), buffer(nullptr) { ~Array() { if (buffer) delete[] buffer; Array(const Array & proto) { size = proto.size; buffer = new float[size]; memcpy(buffer, proto.buffer, size*sizeof(float)); ;... Συνάρτηση C αντιγραφής μπλοκ μνήμης. Χρήσιμη για γρήγορη αντιγραφή συνεχούς περιοχής δεδομένων 12

void main(int argc, char* argv[]) { Array a1(4); a1[0] = 1.f; Array a2 = a1; a2[0] = 2.f; Καλείται ο δικός μας κατασκευαστής αντιγραφής: Κάθε αντικείμενο έχει το δικό του αντίγραφο του πίνακα buffer αντί για να δείχνει στην ίδια περιοχή μνήμης. Array a3(a2); a3[0] = 3.f; cout << a1[0] << << a2[0] << << a3[0] ; // Τυπώνει 1 2 3 Δε δημιουργείται πλέον πρόβλημα με τη delete[] μέσα στον καταστροφέα 13

Στον κώδικα που είδαμε, η μέθοδος του κατασκευαστή αντιγραφής είχε πρόσβαση σε προστατευμένα πεδία του αντικειμένου που περάσαμε. Γιατί μπορεί να το κάνει αυτό?!?!? Γιατί ο προσδιοριστής ορατότητας των πεδίων εφαρμόζεται σε επίπεδο κλάσης, όχι αντικειμένου! Δύο αντικείμενα της ίδιας κλάσης μπορούν να έχουν πρόσβαση το ένα στα μη δημόσια πεδία του άλλου 14

Ο τελεστής ανάθεσης (=) επιχειρεί να δώσει την τιμή ενός δεδομένου σε ένα άλλο Όταν και οι 2 τελεσταίοι είναι του ίδιου τύπου, τότε αυτός ο τελεστής αποτελεί μια από τις ειδικές μεθόδους μιας κλάσεις, τον copy assignment operator (τελεστής ανάθεσης με αντιγραφή) Όπως με τον κατασκευαστή αντιγραφής, έτσι και στην περίπτωση του =, ο μεταγλωττιστής δημιουργεί έναν έτοιμο τελεστή =, αν δε δώσουμε το δικό μας 15

Καλείται όταν έχει δημιουργηθεί ένα αντικείμενο και γίνεται σε αυτό ανάθεση άλλου αντικειμένου ίδιου τύπου: void main(int argc, char* argv[]) { Array a1(4); Array a2 = a1; a2 = Array(6); Εδώ καλείται ο copy constructor, παρά το =, αφού το a2 δεν έχει αρχικοποιηθεί ακόμα Εδώ καλείται ο copy assignment operator, μιας και το αντικείμενο a2 ήδη υπάρχει. 16

Array a1(3); 0x0060??? Array a1 buffer=0x0060 size=3 Array a2; 0x0060??? 0x007C???? Array a1 buffer=0x0060 size=3 Array a2 buffer=0x0072 size=4 a2 = a1; 0x0060??? 0x007C???? Array a1 buffer=0x0060 size=3 Array a2 buffer=0x0060 size=3 17

Διαρροή μνήμης! 0x0060??? 0x007C???? Array a1 buffer=0x0060 size=3 Array a2 buffer=0x0060 size=3 a1::~array() { if (buffer) delete[] buffer; a2::~array() { if (buffer) delete[] buffer; 18

class Array {... Array(const Array & proto) { size = proto.size; buffer = new float[size]; memcpy(buffer,proto.buffer,size*sizeof(float)); void operator =(const Array & src) { if (buffer!=nullptr) delete[] buffer; size = src.size; buffer = new float[size]; memcpy(buffer, src.buffer, size*sizeof(float)); 19

Ή καλύτερα: class Array {... private: void Replicate( const Array & in) { size = proto.size; buffer = new float[size]; memcpy(buffer,proto.buffer,size*sizeof(float)); public: Array(const Array & proto) { Replicate(proto); void operator =(const Array & src) { if (buffer!=nullptr) delete[] buffer; Replicate(src); 20

void main(int argc, char* argv[]) { Array a1(4); Array a2, a3; a3 = a2 = a1; Δε μπορούμε με την τρέχουσα υλοποίηση να κάνουμε αλυσιδωτή ανάθεση: Ο τελεστής δεν επιστρέφει τιμή. 21

class Array {... Array& operator =(const Array & src) { if (buffer!=nullptr) delete[] buffer; Replicate(src); return *this; 22

void main(int argc, char* argv[]) { Array a1(4); Array a2, a3; a3 = a2 = a1; // ok! a1 = a1; Δεν απαγορεύεται, αλλά ούτε δουλεύει! Καταστρέφονται τα περιεχόμενα του buffer 23

class Array {... Array& operator =(const Array & src) { if (&src==this) return *this; if (buffer!=nullptr) delete[] buffer; size = src.size; Συγκρίνουμε τις διευθύνσεις των 2 αντικειμένων. Αν είναι ίδιες, πρόκειται για αυτό-ανάθεση, οπότε δεν κάνουμε τίποτα buffer = new float[size]; memcpy(buffer, src.buffer, size*sizeof(float)); return *this; 24