Για να σε βοηθήσω πρέπει να κάνεις ένα βήμα πίσω και να σκεφτείς "τι είναι μια κλάση?"
Λόγω απλότητας έστω οτι η σωστή απάντηση είναι "ένας τύπος μεταβλητής που δημιουργώ". Δηλαδή αν φτιάξω ένα class Human
τότε απο εκεί και έπειτα είμαι σε θέση να δημιουργώ μεταβλητές τύπου Human
.
(πχ έστω Human me = new Human();
).
Στο παραπάνω παράδειγμα αυτό που βλέπεις να κάνω κατά τη δημιουργία του me
(στα δεξία του '=') είναι η κλήση στον constructor.
Οπότε αν έπρεπε να απαντήσω μόνο στην ερώτηση "Τι ρόλο παίζει ο constructor?" θα σου έλεγα (συνοπτικά) τα εξής:
Είναι μια συνάρτηση που ορίζεις για να εκφράσεις το "τι συμβαίνει κάθε φορά που δημιουργείται ένας Human". Στο παραπάνω παράδειγμα η συνάρτηση αυτή του κατασκευαστή πιθανώς δεν έκανε και πολλά. Όμως σκέψου πως θα μπορούσες να περνάς παραμέτρους σε έναν κατασκευαστή (όπως και σε κάθε άλλη συνάρτηση)... πχ
Human me = new Human(firstname, lastname, birthdate)
σε αυτή τη περίπτωση ο κατασκευαστής μάλλον εσωτερικά θα είχε την ευθύνη του να αναθέσει στις εσωτερικές μεταβλητές του Human τις τιμές που πέρασα, έτσι ώστε μετά από αυτή τη γραμμή να μπορώ ελεύθερα να κάνω
cout << me.lastName << endl;
και να τυπωνεται ότι πέρασα τη στιγμή της κατασκευής!
(spoiler: ειναι επισης καλή πρακτική να μην επιτρέπεις απευθείας πρόσβαση στα μέλη της κλάσης σου, αν σου κινει την περιεργια κάνε ένα νέο ποστ για αυτό :) )
Για να είμαι ειλικρινής, ο κατασκευαστής δεν κάνει κάτι που δεν μπορείς να κάνεις κάπως αλλιώς. Θα μπορούσες σε όλη σου τη ζωή να γράφεις κενούς κατασκευαστές και μετά απο κάθε δημιουργία ενός αντικειμένου να έκανες
me.setFirstName("Bobbie");
me.setLastName("Tables");
me.setBirthday(1942);
Ελπίζω να είδες τον χαμένο χρόνο/κόπο του να το γράφεις αυτό συνέχεια :P
In a nutshell : Ο κατασκευαστής περιέχει τα απαραίτητα βήματα (ορισμένα από εσένα) για να θεωρήσεις ένα νέο αντικείμενο έτοιμο προς χρήση.
Μπορεί στα παραδείγματα/ασκήσεις που κάνεις να μην φαίνεται πολύ καθαρά η χρησιμότητα/"ανάγκη" του κατασκευαστή. Σε πιο προχωρημένα concept αντικειμενοστραφούς C++ το να είσαι σε θέση να ορίσεις με ποιά βήματα γίνονται διάφορες λειτουργίες μιας κλάσης (έστω ο κατασκευαστής Human(...)
η καποια μέθοδος getFirstname()
) αποδευκνύεται αρκετά δυσκολότερο, και ταυτόχρονα σωτήριο.
Αλλά η όλη φιλοσοφία είναι πως το ορίζεις σωστά μία φορά, και το χρησιμοποιείς για πάντα :)