cpp:object_creation
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
cpp:object_creation [2017/04/20 08:13] – [Δημιουργία και ανάθεση αντικειμένων σε δείκτες] gthanos | cpp:object_creation [2017/04/20 09:33] – gthanos | ||
---|---|---|---|
Line 73: | Line 73: | ||
Τα αντικείμενα που φτιάξαμε μέχρι τώρα αποθηκεύονται μέσα στη στοίβα της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, | Τα αντικείμενα που φτιάξαμε μέχρι τώρα αποθηκεύονται μέσα στη στοίβα της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, | ||
- | Υπάρχουν όμως περιπτώσεις που θέλουμε να ορίσουμε ένα αντικείμενο το οποίο θα παραμείνει και μετά την έξοδο από τη συνάρτηση που το δημιούργησε. Σε αυτές τις περιπτώσεις αρκεί να ορίσουμε ένα δείκτη προς το αντικείμενο και να το αρχικοποιήσουμε με τη βοήθεια του τελεστή //new// όπως παρακάτω: | + | Παρακάτω δίνεται ο κώδικας της συνάρτησης //foo// η οποία δημιουργεί ένα πίνακα από δύο αντικείμενα τύπου // |
+ | |||
+ | <code cpp foo.cpp> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | #include " | ||
+ | |||
+ | void foo(void) { | ||
+ | Rectangle rect[2] = { {5,6}, {3,4} }; | ||
+ | cout << " | ||
+ | cout << " | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | int x=5, y=3; | ||
+ | foo(); | ||
+ | cout << "x: " << x << ", y: " << y << endl; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Ακολουθεί το σχηματικό διάγραμμα του //stack// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | Υπάρχουν όμως περιπτώσεις που θέλουμε να ορίσουμε ένα αντικείμενο το οποίο θα παραμείνει και μετά την έξοδο από τη συνάρτηση που το δημιούργησε. Σε αυτές τις περιπτώσεις αρκεί να ορίσουμε ένα δείκτη προς το αντικείμενο και να το αρχικοποιήσουμε με τη βοήθεια του τελεστή //new//. Ο τελεστής //new// έχει την δυνατότητα να δεσμεύσει τον απαραίτητο χώρο στο //heap// και να καλέσει τον κατασκευαστή για το αντικείμενο που θα δημιουργηθεί. Παρακάτω βλέπετε ένα παράδειγμα όπου η συνάρτηση //foo// επιστρέφει ένα αντικείμενο της κλάσης // | ||
+ | |||
+ | <code cpp foo.cpp> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | #include " | ||
+ | |||
+ | Rectangle* foo(int w, int h) { | ||
+ | Rectangle *rect_ptr = new Rectangle {w,h}; | ||
+ | return rect_ptr; | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | int x=5, y=3; | ||
+ | Rectangle *rect = foo(x,y); | ||
+ | cout << "x: " << x << ", y: " << y << endl; | ||
+ | cout << "area : " << rect-> | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | όπως παρακάτω: | ||
<code cpp> | <code cpp> | ||
Line 82: | Line 127: | ||
r2 = new Rectangle = {5, 6}; | r2 = new Rectangle = {5, 6}; | ||
r3 = new Rectangle[2] { {4,8}, {7,3} }; | r3 = new Rectangle[2] { {4,8}, {7,3} }; | ||
- | cout << " | + | cout << " |
- | cout << " | + | cout << " |
- | cout << " | + | cout << " |
- | cout << " | + | cout << " |
- | cout << " | + | cout << " |
delete bar; | delete bar; | ||
delete[] baz; | delete[] baz; |
cpp/object_creation.txt · Last modified: 2021/05/07 06:22 (external edit)