C++ pointer & reference ερωτηση

Nikos Platis nplatis at freemail.gr
Mon Dec 1 17:09:14 EET 2008



O/H Theodore Lytras έγραψε:
> Θα ήθελα να ρωτήσω κάτι συγκεκριμένο (πάντα με την υποσημείωση οτι
> είμαι ερασιτέχνης στον προγραμματισμό):
>
> Έχω σε κάποιο σημείο του κώδικά μου έναν δείκτη σε ένα αντικείμενο της
> κλάσης foo, και δουλεύω πάνω στο δείκτη.
> Θέλω να περάσω το αντικείμενο αυτό σε μια μέθοδο myMethod, η οποία
> δέχεται *αναφορά* σε αντικείμενο της κλάσης foo.
> Είναι προφανές οτι θα πρέπει να κάνω dereference τον δείκτη μου
> (βάζοντας το αστεράκι αριστερά), και να περάσω το αντικείμενο.
>
> Αυτό που θέλω να ρωτήσω είναι αν αυτό το operation έχει κάποιο overhead.
>   
Προφανώς οποιαδήποτε ενέργεια έχει κάποιο κόστος, όσο μικρό και αν 
πιθανώς είναι! Από την άλλη, το τελικό κόστος είναι φυσικά συνάρτηση του 
πόσες φορές θα γίνει, στην περίπτωσή σου, η μετατροπή: αν είναι κάτι που 
γίνεται συνεχώς σε ένα πρόγραμμα στο οποίο έχει έννοια το κυνήγι της 
μέγιστης απόδοσης, τότε ίσως να σε ενδιαφέρει. Σε τελική ανάλυση, 
μπορείς να κάνεις κάποιες δοκιμές - χρονομετρήσεις ώστε να δεις την 
επίπτωση.
> Μήπως είναι καλύτερα να φτιάξω την μέθοδο myMethod να δέχεται (και να
> δουλεύει με) δείκτη σε αντικείμενο foo? (Αφού ούτως ή άλλως στην
> καλούσα συνάρτηση δουλεύω με δείκτη). Και έτσι να περνάω κατευθείαν
> τον δείκτη?
> Ή δεν έχει σημασία από άποψη απόδοσης/efficiency?
>
> Και από πλευράς programming style?
> Μήπως είναι καλύτερα να χρησιμοποιώ μόνο δείκτες στον κώδικά μου, ή
> μόνο αναφορές? Μήπως είναι "μπερδευτικός" ο κώδικας όταν μπλέκουν τα
> δύο?
>   
Θα έλεγα ότι η χωρίς λόγο μείξη των δύο μόνο μειονεκτήματα μπορεί να 
έχει: και μόνο αυτά που αναφέρεις (κόστος μετατροπής, ομοιογένεια 
κώδικα) μπορούν δυνητικά να είναι πολύ σοβαρά.

Νομίζω ότι σε C++ ταιριάζουν πιο πολύ οι αναφορές (οι οποίες άλλωστε δεν 
υπήρχαν στη C) ενώ οι δείκτες μπορεί να φαίνονται πιο «φυσικοί» σε 
κάποιον που τους έχει συνηθίσει από C.

Χρησιμοποιώντας δείκτες είναι λίγο πιο ξεκάθαρο ότι σκοπεύουμε να 
αλλάξουμε την τιμή της παραμέτρου στη συνάρτηση (αν το σκοπεύουμε!), ενώ 
με τις αναφορές συντακτικά κατά την κλήση δεν υπάρχει διαφοροποίηση.

Σημαντική επίσης η χρήση του const: Στην περίπτωση των αναφορών, το 
πέρασμα με const & είναι σαν να περνάς την τιμή (καθώς δεν μπορεί να 
αλλάξει) αλλά γλυτώνεις την αντιγραφή. Στην περίπτωση του δείκτη, έχει 
σημασία πού θα βάλεις const ώστε να περιορίσεις τις αλλαγές (Type 
[const] * [const] x) 
(http://duramecho.com/ComputerInformation/WhyHowCppConst.html)

Καλή συνέχεια!

Νίκος


> Να πω την αλήθεια, μ'αρέσουν οι δείκτες, είναι πολύ ευέλικτοι και με
> λίγο προσοχή δε πιστεύω (μήπως είμαι υπερόπτης?) οτι κινδυνεύω από
> null pointers ή memory leaks.
> Μπορούμε να διατυπώσουμε μερικές αρχές για το πως είναι ωραιότερο να
> χρησιμοποιούμε το ένα ή το άλλο (χωρίς να μπλέξουμε σε pointers vs.
> references flamewar).
>
> Π.χ. διάβασα κάπου οτι είναι καλύτερο οι μέθοδοι μιας κλάσης να
> δουλεύουν με references, γιατί "κρύβουν" καλύτερα τα "ενδότερά" τους
> από την καλούσα συνάρτηση. Ισχύει κάτι τέτοιο? Γιατί κάπως κουφό μου
> ακούστηκε: φαντάζομαι οτι πρέπει να ξέρει κανείς αν τα ορίσματα της
> μεθόδου περνούν by-value ή by-reference (είτε με pointer είτε με
> reference).
>
> Αυτά και συγνώμη για τη φλυαρία...
>
> Θοδωρής
>
> --
> linux-greek-users mailing list -- http://lists.hellug.gr

-- 
-----------------------------------------------------------------------
Nikos Platis                                e-mail: nplatis at freemail.gr

"The empires of the future are the empires of the mind." - W. Churchill
-----------------------------------------------------------------------




More information about the Linux-greek-users mailing list