1 ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D. Χειµώνας 2006 ιάλεξη 9η: Ερωτήσεις
2 Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cp p_fall06.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr etousido@uth.gr
3 Ερώτηση 1 Υπάρχει λάθος στον κώδικα; ΕΝ µπορούµενα αρχικοποιήσουµεέναstatic µέλος µε τον τρόπο αυτό.
4 Ερώτηση 2 Υπάρχει λάθος στον κώδικα; ΕΝ µπορούµενα αρχικοποιήσουµεέναstatic µέλος µε τον τρόπο αυτό. Linker error.
5 Ερώτηση 3 Υπάρχει λάθος στον κώδικα; Εάν ΝΑΙ, τότε ποιο είναι; Εάν ΌΧΙ, τότε τι τυπώνει; ΕΝ υπάρχει λάθος. Τυπώνει 1, γιατί καλείται η geta() της κλάσης Base.
6 Ερώτηση 4 Υπάρχει λάθος στον κώδικα; ΕΝ υπάρχει λάθος. Ένας constructor µπορεί να πετάει µια exception.
7 Ερώτηση 5 Υπάρχει λάθος στον κώδικα; ΕΝ θα έπρεπε να σηµατοδοτείται ως λάθος. Έξαρτάται από τον compiler. Η VC++6 δεν το δέχεται. Μετά από καιρό ίσως υλοποιηθεί ευρύτατα.
8 Ερώτηση 6 Υπάρχει λάθος στον κώδικα; Abmormal program termination! Όταν ενεργοποιείται αυτό το throw, καταστρέφεται το αντικείµενο b και συνεπώς πετάγεται µια exception από τον destructor του. Throwing an exception while an exception is being handled results in "terminate" being called. εν είναι ασφαλές να πετάµε exceptions από destructors.
9 Ερώτηση 7 Υπάρχει λάθος στον κώδικα; Εάν ΝΑΙ, τότε ποιο είναι; Εάν ΌΧΙ, τότε τι τυπώνει; ΕΝ υπάρχει λάθος. Τυπώνει 345, γιατίκαλείταιηprint() της κλάσης Base παρόλο που είναι virtual συνάρτηση! Ερµηνεία: Μέχρι να τερµατιστεί ο constructor της Derived, δεν υπάρχει το αντικείµενο Derived
10 Ερώτηση 8 Υπάρχει λάθος στον κώδικα; Κατασκευάζεται το ΣΩΣΤΟ αντικείµενο. Ως ο constructor να ήταν virtual!!!!
11 Ερώτηση 9 Υπάρχει λάθος στον κώδικα; Εάν ΝΑΙ, τότε ποιο είναι; Εάν ΌΧΙ, τότε τι τυπώνει; ΕΝ υπάρχει λάθος. Τυπώνει Base, γιατί καλείται η print() της κλάσης Base παρόλο που είναι virtual συνάρτηση! Ερµηνεία: Όταν αρχίσει η καταστροφή του Deived (κλήση destructor), τότε παύει να είναι ένα αντικείµενο Derived
12 Ερώτηση 10 Υπάρχει λάθος στον κώδικα; Εάν ΝΑΙ, τότε ποιο είναι; Εάν ΌΧΙ, τότε τι τυπώνει; ΕΝ πιάνει την exception (µήνυµα Unhandled Exception ), επειδή, η SubExcept ΕΝ είναι BaseExcept. Θυµηθείτε ότι η private κληρονοµικότητα δεν πειγράφει µια is-a σχέση µεταξύ των κλάσεων.
13 Ερώτηση 11 Υπάρχει λάθος στον κώδικα; Εάν ΝΑΙ, τότε ποιο είναι; Εάν ΌΧΙ, τότε τι τυπώνει; ΕΝ υπάρχει λάθος. Τυπώνει Base, γιατίκαλείταιηprint() της κλάσης Base παρόλο που είναι virtual συνάρτηση(!), αφού η exception πιάνεται µετιµή.
14 Ερώτηση 12 Υπάρχει λάθος στον κώδικα; Εάν ΝΑΙ, τότε ποιο είναι; Εάν ΌΧΙ, τότε τι τυπώνει; ΕΝ υπάρχει λάθος. Τυπώνει Sub, γιατί καλείται η print() της κλάσης SubExcept, αφού η exception πιάνεται µε αναφορά.
15 Ερώτηση 13 Υπάρχει λάθος στον κώδικα; Γενικώς, εξαρτάται από τον compiler. Θα πρέπει να είναι runtime error, γιατί ο δείκτης bp πρέπει να είναι NULL, όταν µπαίνει στο catch block, αφού το αντικείµενο δεν κατασκευάστηκε.
16 Ερώτηση 14 Υπάρχει λάθος στον κώδικα; Ο VC++6 (όπως και οι περισσότεροι compilers) ΕΝ σηµατοδοτεί κάποιο λάθος. ΌΜΩΣ: α) Χρησιµοποιεί συνάρτηση κάποιου αντικειµένου πριν κατασκευαστεί αυτό το αντικείµενο, β) αναθέτει τιµή σε µέλος αντικειµένου, πριν κατασκευαστεί αυτό το αντικείµενο.