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:function_try_blocks [2019/05/06 19:48] – [Exception που συμβαίνουν στον κατασκευαστή της προγόνου κλάσης] gthanos | cpp:function_try_blocks [2019/05/15 07:56] – [Εξαιρέσεις που παράγονται στον κατασκευαστή] gthanos |
---|
</code> | </code> |
| |
Από τις εκτυπώσεις, παρατηρούμε ότι καταστρέφεται το αντικείμενο //lastname//, αλλά όχι και το αντικείμενο //firstname//. Ο λόγος είναι ότι δημιουργηθεί ένα //exception// στον κατασκευαστή, __δεν καλείται ποτέ ο καταστροφέας της κλάσης__. Καταστρέφονται αυτόματα όλα τα αντικείμενα που έχουν δεσμευτεί στο //stack//, και λαμβάνει χώρα η διαδικασία του //stack unwinding// που είδαμε σε προηγούμενη παράγραφο. | Από τις εκτυπώσεις, παρατηρούμε ότι καταστρέφεται το αντικείμενο //lastname//, αλλά όχι και το αντικείμενο //firstname//. Ο λόγος είναι ότι δημιουργηθεί ένα //exception// στον κατασκευαστή, __δεν καλείται ποτέ ο καταστροφέας της κλάσης__. Καταστρέφονται αυτόματα όλα τα αντικείμενα που έχουν δεσμευτεί στο //stack//, και λαμβάνει χώρα η διαδικασία του //[[cpp:stack_unwinding|stack unwinding]]//. |
| |
Ως εκ τούτου, δεν καταστρέφονται τα αντικείμενα που είναι δεσμευμένα στο //heap// και γενικότερα //resources// που περιμένουμε να απελευθερωθούν στον καταστροφέα της κλάσης. | Ως εκ τούτου, δεν καταστρέφονται τα αντικείμενα που είναι δεσμευμένα στο //heap// και γενικότερα τα //resources// που περιμένουμε να απελευθερωθούν στον καταστροφέα της κλάσης. |
| |
<WRAP tip 80% center round> | <WRAP tip 80% center round> |
</code> | </code> |
| |
Η παραπάνω σύνταξη επιτρέπει να πιάσουμε το exception που συμβαίνει στον κατασκευαστή της προγόνου κλάσης. Και εδώ το //exception// θα αναπαραχθεί σύμφωνα με τους κανόνες που ίσχυσαν και στο προηγούμενο παράδειγμα. | Η παραπάνω σύνταξη επιτρέπει να πιάσουμε το exception που συμβαίνει στον κατασκευαστή της προγόνου κλάσης. Και εδώ το //exception// θα αναπαραχθεί σύμφωνα με τους κανόνες που ίσχυσαν και στο προηγούμενο παράδειγμα. Παρατηρήστε ότι δεν εκτυπώνεται ποτέ το μήνυμα **"Student constructor"** του κατασκευαστή. Γιατί? |
| |
| Η μέθοδος //main// δίνεται παρακάτω: |
| |
| <code cpp main.cpp> |
| #include <iostream> |
| using namespace std; |
| |
| #include "Person.hpp" |
| #include "Student.hpp" |
| |
| int main() { |
| try { |
| Student johnSnow("John", "Snow", 1234); |
| } catch(BadName& a) { |
| cout << "Exception occured: " << a.what() << endl; |
| } |
| } |
| </code> |
| |