C πώς να καθορίσετε τον τύπο μιας συνάρτησης σε ένα πρότυπο. Λειτουργίες προτύπου

Πρόγραμμα Kerish Doctor. 15.07.2019

Μπορείτε να δημιουργήσετε πρωτότυπο ένα πρότυπο λειτουργίας δηλώνοντάς το εκ των προτέρων.

Αυτή η δήλωση ενημερώνει τον μεταγλωττιστή για την παρουσία του προτύπου και επίσης ενημερώνει τον μεταγλωττιστή για τις αναμενόμενες παραμέτρους. Για παράδειγμα, το πρωτότυπο του προτύπου λειτουργίας Ταξινόμησης θα μοιάζει με αυτό: πρότυπο

void Sort (Πίνακας T, μέγεθος Tsize);

Αυτή η δήλωση ενημερώνει τον μεταγλωττιστή για την παρουσία του προτύπου και επίσης ενημερώνει τον μεταγλωττιστή για τις αναμενόμενες παραμέτρους. Για παράδειγμα, το πρωτότυπο του προτύπου λειτουργίας Ταξινόμησης θα μοιάζει με αυτό: Τα ονόματα των τυπικών παραμέτρων ενός προτύπου ενδέχεται να μην είναι τα ίδια στην προ-δήλωση και στον ορισμό του προτύπου. Έτσι, για παράδειγμα, στο παρακάτω απόσπασμα τόσο το πρωτότυπο όσο και ο ορισμός του προτύπου αναφέρονται στην ίδια λειτουργία:

Αυτή η δήλωση ενημερώνει τον μεταγλωττιστή για την παρουσία του προτύπου και επίσης ενημερώνει τον μεταγλωττιστή για τις αναμενόμενες παραμέτρους. Για παράδειγμα, το πρωτότυπο του προτύπου λειτουργίας Ταξινόμησης θα μοιάζει με αυτό:

T max(T, T);

Τύπος max (Τύπος a, Τύπος b)

αν (α > β) επιστρέφει a; αλλιώς επιστροφή β?

Χρήση προτύπου συνάρτησης Ένα πρότυπο συνάρτησης περιγράφει πώς μια συγκεκριμένη συνάρτηση μπορεί να κατασκευαστεί με βάση έναν ή περισσότερους πραγματικούς τύπους. Ο μεταγλωττιστής δημιουργεί αυτόματα ένα σώμα συνάρτησης αντιπροσωπευτικό για τους τύπους που καθορίζονται στην κλήση. Αυτή η διαδικασία ονομάζεταιπροσδιορισμός

.

Αυτή η δήλωση ενημερώνει τον μεταγλωττιστή για την παρουσία του προτύπου και επίσης ενημερώνει τον μεταγλωττιστή για τις αναμενόμενες παραμέτρους. Για παράδειγμα, το πρωτότυπο του προτύπου λειτουργίας Ταξινόμησης θα μοιάζει με αυτό:

Εμφανίζεται όταν καλείται μια συνάρτηση προτύπου.

Για παράδειγμα, στο ακόλουθο παράδειγμα, η συνάρτηση min() δημιουργείται δύο φορές: μία με τύπο int και μία με τύπο double:< b) return a; else return b;

Τύπος min (Τύπος a, Τύπος b)

αν ένα

int x = 4, y = 5, z;

διπλό t = 6,56, r = 3,07, p;

Αυτή η δήλωση ενημερώνει τον μεταγλωττιστή για την παρουσία του προτύπου και επίσης ενημερώνει τον μεταγλωττιστή για τις αναμενόμενες παραμέτρους. Για παράδειγμα, το πρωτότυπο του προτύπου λειτουργίας Ταξινόμησης θα μοιάζει με αυτό:

Εμφανίζεται όταν καλείται μια συνάρτηση προτύπου.

Για παράδειγμα, στο ακόλουθο παράδειγμα, η συνάρτηση min() δημιουργείται δύο φορές: μία με τύπο int και μία με τύπο double:< b) return a; else return b;

Εξειδίκευση προτύπων συνάρτησης

Μια εξειδικευμένη συνάρτηση προτύπου είναι μια κανονική συνάρτηση της οποίας το όνομα είναι ίδιο με τη συνάρτηση στο πρότυπο, αλλά η οποία ορίζεται για παραμέτρους συγκεκριμένων τύπων.

Οι εξειδικευμένες λειτουργίες προτύπου ορίζονται όταν ένα γενικό πρότυπο δεν είναι κατάλληλο για έναν συγκεκριμένο τύπο δεδομένων. Για παράδειγμα, η συνάρτηση προτύπου min

δεν μπορεί να χρησιμοποιηθεί για συμβολοσειρές (για τον τύπο char*), καθώς ο κώδικας που δημιουργείται από τον μεταγλωττιστή θα συγκρίνει απλώς τις θέσεις μνήμης (διευθύνσεις). Για να συγκρίνετε σωστά τις συμβολοσειρές, μπορείτε να ορίσετε μια εξειδικευμένη συνάρτηση:

char* min(char* s1, char* s2)

if (strcmp(s1,s2)>0) επιστρέφει s2; αλλιώς επιστροφή s1?<< “max int = ” << max(i1, i2) << endl;

Στη συνέχεια, μπορείτε να αποκτήσετε πρόσβαση σε μια τέτοια συνάρτηση με τον ίδιο τρόπο όπως μια συνάρτηση προτύπου:

int i1 = 3, i2 = 5;

if (strcmp(s1,s2)>0) επιστρέφει s2; αλλιώς επιστροφή s1?<< “max str = “ << max(s1, s2) << endl;

cout

char* s1 = "Golden Eagle"; char* s2 = “Perigrine Falcon”; Πρότυπα τάξηςΠρότυπο τάξης δίνει έναν γενικό ορισμό μιας οικογένειας κλάσεων που χρησιμοποιούν αυθαίρετους τύπους ή σταθερές. Το μοτίβο ορίζειμέλη δεδομένων προτύπου

Και

Αυτή η δήλωση ενημερώνει τον μεταγλωττιστή για την παρουσία του προτύπου και επίσης ενημερώνει τον μεταγλωττιστή για τις αναμενόμενες παραμέτρους. Για παράδειγμα, το πρωτότυπο του προτύπου λειτουργίας Ταξινόμησης θα μοιάζει με αυτό:<<список аргументов шаблона>>

συναρτήσεις μέλους προτύπου<имя класса>

<тело класса>

Η λέξη-κλειδί του προτύπου ακολουθείται από ένα ή περισσότερα ορίσματα (παράμετροι) που περικλείονται σε αγκύλες και χωρίζονται με κόμματα. Κάθε όρισμα μπορεί να είναι μια λέξη-κλειδί κλάσης ακολουθούμενη από ένα αναγνωριστικό που υποδεικνύει τον παραμετροποιημένο τύπο.

Η λίστα ορισμάτων προτύπου δεν μπορεί να είναι κενή.

Ακολουθεί ο ορισμός της κλάσης. Είναι παρόμοιο με τον ορισμό μιας κανονικής κλάσης, με τη διαφορά ότι χρησιμοποιεί μια λίστα ορισμάτων προτύπου. Οι παράμετροι προτύπου που αποτελούνται από τη λέξη-κλειδί κλάσης ακολουθούμενη από ένα αναγνωριστικό καλούνται συχνάπαραμέτρους τύπου

.

Με άλλα λόγια, ενημερώνουν τον μεταγλωττιστή ότι το πρότυπο αναμένει έναν τύπο ως όρισμα.

Μια συνάρτηση προτύπου ορίζει ένα γενικό σύνολο λειτουργιών που θα εφαρμοστούν σε διαφορετικούς τύπους δεδομένων. Χρησιμοποιώντας αυτόν τον μηχανισμό, είναι δυνατή η εφαρμογή ορισμένων γενικών αλγορίθμων σε ένα ευρύ φάσμα δεδομένων. Όπως γνωρίζετε, πολλοί αλγόριθμοι είναι λογικά ίδιοι ανεξάρτητα από το είδος των δεδομένων με τα οποία λειτουργούν. Για παράδειγμα, ο αλγόριθμος Quicksort είναι ο ίδιος τόσο για έναν πίνακα ακεραίων όσο και για έναν πίνακα αριθμών κινητής υποδιαστολής. Μόνο ο τύπος των δεδομένων προς ταξινόμηση διαφέρει. Δημιουργώντας μια γενική συνάρτηση, μπορείτε να ορίσετε την ουσία του αλγορίθμου ανεξάρτητα από τον τύπο δεδομένων. Μετά από αυτό, ο μεταγλωττιστής δημιουργεί αυτόματα τον σωστό κώδικα για τον τύπο δεδομένων για τον οποίο δημιουργείται η συγκεκριμένη υλοποίηση της συνάρτησης στο στάδιο της μεταγλώττισης. Ουσιαστικά, όταν δημιουργείται μια συνάρτηση προτύπου, δημιουργεί μια συνάρτηση που μπορεί αυτόματα να υπερφορτώσει τον εαυτό της. Οι συναρτήσεις προτύπου δημιουργούνται χρησιμοποιώντας τη λέξη-κλειδί προτύπου. Η συνήθης σημασία της λέξης "μοτίβο" αντικατοπτρίζει αρκετά πλήρως τη χρήση της στη C++. Ένα πρότυπο χρησιμοποιείται για τη δημιουργία του σκελετού μιας συνάρτησης, αφήνοντας τις λεπτομέρειες υλοποίησης στον μεταγλωττιστή. Η γενική μορφή μιας συνάρτησης προτύπου είναι η εξής:
{
πρότυπο
}

Επιστροφή_τύπος_όνομα_συνάρτησης (λίστα παραμέτρων)

Παρακάτω είναι ένα σύντομο παράδειγμα που δημιουργεί μια συνάρτηση προτύπου που έχει δύο παραμέτρους. Αυτή η συνάρτηση αλλάζει τις τιμές αυτών των παραμέτρων μεταξύ τους. Δεδομένου ότι η γενική διαδικασία ανταλλαγής τιμών μεταξύ δύο μεταβλητών δεν εξαρτάται από τον τύπο τους, μπορεί φυσικά να εφαρμοστεί χρησιμοποιώντας μια συνάρτηση προτύπου.

// παράδειγμα προτύπου συνάρτησης
#περιλαμβάνω
// πρότυπο συνάρτησης
πρότυπο εναλλαγή κενού (X &a, X &b)
{
X θερμοκρασία;
θερμοκρασία = a;
a = b;
b = θερμοκρασία;
}
int main()
{
int i=10, j = 20;
float x=10,1, y= 23,3;
char a="x", b="z";
cout<< "Original i, j: " << i << " " << j << endl;
cout<< "Original x, y: " << x << " " << у << endl;
cout<< "Original a, b: " << a << " " << b << endl;
swap(i, j); // ανταλλαγή ακεραίων
swap(x, y); // ανταλλαγή πραγματικών αξιών
swap(a, b); // ανταλλαγή χαρακτήρων
cout<< "Swapped i, j: " << i << " " << j << endl;
cout<< "Swapped x, y: " << x << " " << у << endl;
cout<< "Swapped a, b: " << a << " " << b << endl;
επιστροφή 0;
}

Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτό το πρόγραμμα. Γραμμή

Πρότυπο εναλλαγή κενού (X &a, X &b)

Υποδεικνύει στον μεταγλωττιστή ότι δημιουργείται ένα πρότυπο. Εδώ το X είναι το πρότυπο τύπου που χρησιμοποιείται ως παράμετρος τύπου. Στη συνέχεια ακολουθεί η δήλωση της συνάρτησης swap(), χρησιμοποιώντας τον τύπο δεδομένων X για εκείνες τις παραμέτρους που θα ανταλλάξουν τιμές. Στη συνάρτηση main(), η συνάρτηση swap() καλείται με τρεις διαφορετικούς τύπους δεδομένων που της διαβιβάζονται: ακέραιοι, αριθμοί κινητής υποδιαστολής και χαρακτήρες. Επειδή η συνάρτηση swap() είναι μια συνάρτηση προτύπου, ο μεταγλωττιστής θα δημιουργήσει αυτόματα τρεις διαφορετικές εκδόσεις της συνάρτησης swap() - μια για εργασία με ακέραιους αριθμούς, μια άλλη για εργασία με αριθμούς κινητής υποδιαστολής και, τέλος, μια τρίτη για εργασία με μεταβλητές χαρακτήρων.

Μέχρι τώρα, έχουμε συζητήσει τα θέματα κατασκευής κλάσεων προτύπων με βάση προκαθορισμένα (που περιλαμβάνονται στη βιβλιοθήκη κλάσεων) πρότυπα κλάσεων. Αυτή η ενότητα εξετάζει την τεχνική της δήλωσης προτύπων κλάσεων και προτύπων συναρτήσεων χρησιμοποιώντας ένα απλό παράδειγμα.

Η κλάση προτύπου παρέχει μια τυπική υλοποίηση πρόσθετης λειτουργικότητας που βασίζεται σε κλάσεις μπαλαντέρ που έχουν δηλώσει προηγουμένως.

Αυτή η πρόσθετη λειτουργία μπορεί να επιβάλλει πρόσθετους περιορισμούς στην κλάση χαρακτήρων μπαλαντέρ. Για παράδειγμα, για να λειτουργήσει με επιτυχία ένα αντικείμενο κλάσης προτύπου, η κλάση μπαλαντέρ πρέπει να κληρονομήσει μια συγκεκριμένη διεπαφή. Διαφορετικά, η λειτουργικότητα της κλάσης προτύπου θα είναι απλά αδύνατο να υλοποιηθεί.

Για να σχηματιστούν περιορισμοί στις κλάσεις μπαλαντέρ στη C#, χρησιμοποιείται ο μηχανισμός των οριοθέτων παραμέτρων προτύπου - εισάγεται κατά τη δήλωση ενός προτύπου χρησιμοποιώντας τη λέξη-κλειδί where, την οποία μπορεί να ακολουθήσει το όνομα της παραμέτρου τύπου και μια λίστα τύπων της κλάσης ή διεπαφή ή τον περιορισμό του κατασκευαστή - new():

Χρήση του συστήματος. όπου T: IComparable, new() // Template parameter delimiter new() είναι ένας ειδικός οριοθέτης //. δημόσιο κενό QueueFormer χρησιμοποιώντας System.Collections; χρησιμοποιώντας System.Collections.Generic; Χώρος ονομάτων PatternArrays ( //=========== Αυτή είναι η κεφαλίδα του προτύπου κλάσης W ========== // Φτιάξτο μόνος σου το πρότυπο κλάσης. Το T είναι μια παράμετρος προτύπου. // Μια κλάση προτύπου είναι μια κλάση- ένα πρότυπο που περιγράφεται λεπτομερώς // από μια κλάση μπαλαντέρ // Κατά τη δημιουργία μιας κλάσης προτύπου, οι εμφανίσεις της παραμέτρου // (σε αυτήν την περίπτωση, T) αντικαθίστανται από το όνομα της. μπαλαντέρ // κλάση Ο σχεδιαστής προτύπου κλάσης μπορεί να κάνει απαιτήσεις // σχετικά με τα χαρακτηριστικά της κλάσης μπαλαντέρ. . (Ουρά ουρά, παραμέτρους τιμές Z) ( foreach (Z z σε τιμές) ( ουρά. Enqueue(z); ) ) ) //====================== ========================= // Εδώ είναι οι υποψήφιες κλάσεις για αντικατάσταση στο πρότυπο . // Η πρώτη κατηγορία είναι κατάλληλη, αλλά η δεύτερη δεν είναι κατάλληλη! // Όλα αποφασίζονται στο στάδιο της εκπομπής. //================================================ ================ =============== κλάση xPoints: IComparable ( // Αντικείμενο-γεννήτρια «τυχαίων» αριθμών. static Random rnd = new Random(); public int y; έχοντας // διαφορετικές εκδόσεις των κατασκευαστών του public xPoints(int x, int y) ( this! .x = x; this.y = y; ) // Υπολογίστε την απόσταση από την προέλευση public int R ( get ( return (int) (Math.Sqrt(x * x + y * y) ) ) // Μετά την υλοποίηση της αντίστοιχης διεπαφής αντικειμένου COMPARER // παρέχει την υλοποίηση του αλγορίθμου σύγκρισης public int CompareTo(object p) ( return (this.R -). ((xPoints)p).R) κλάση yPoints ( // "Τυχαίο" αντικείμενο γεννήτριας. αριθμοί. static Random rnd = new Random(); 100); αντικατάσταση // κλάση που αντιπροσωπεύεται από την παράμετρο προτύπου T. public void StackFormer () // Αντικείμενα - εκπρόσωποι της κλάσης προτύπου μπορούν να συγκριθούν // ως αποτέλεσμα της // υλοποίησης της διεπαφής IComparable. if (xw0.wCompare(xw1.t) == 0) Console.WriteLine("Yes"); else Console.WriteLine("Όχι"); // Λόγω των περιορισμών της παραμέτρου προτύπου T, ο ακόλουθος κώδικας // για μια κλάση μπαλαντέρ // είναι βασικά μη εφαρμόσιμος.====================== ===== = //Δ<...>yw0 = νέο W () //Δ yw1 = νέο W () //if (yw0.ww(yw1.t) == 0) Console.WriteLine("Yes"); //Δ //else Console.WriteLine("Όχι"); //================================================ ================ ===== // Επίδειξη χρήσης του προτύπου συνάρτησης. // Με βάση την κλάση αντικατάστασης, // δημιουργήσαμε μια συνάρτηση προτύπου για την κλάση αντικατάστασης, // η οποία εξυπηρετεί ουρές προτύπων που σχηματίζονται με βάση // ένα προκαθορισμένο πρότυπο της κλάσης ουρά .

Παράδειγμα χρήσης προτύπων: ταξινόμηση

Παλιό πρόβλημα, νέες λύσεις χρησιμοποιώντας προκαθορισμένα πρότυπα κλάσεων και διεπαφές...

Χρήση του συστήματος. χρησιμοποιώντας System.Collections; χρησιμοποιώντας System.Collections.Generic; Χώρος ονομάτων PatternArrays ( // Δεδομένα για έναν πίνακα στοιχείων. // Για ταξινόμηση ως μέρος ενός πίνακα μοτίβων χρησιμοποιώντας τη μέθοδο Ταξινόμησης. class Points ( public int x; public int y; public Points (int key1, int key2) ( x = key1; y = key2; ΣΥΓΚΡΙΣΗ ΠΡΟΤΥΠΩΝ με βάση το πρότυπο διεπαφής.. .class myComparer: IComparer ( // Η προτεινόμενη μέθοδος σύγκρισης ΠΡΟΤΥΠΟΥ επιστρέφει τη διαφορά στις αποστάσεις // δύο σημείων (υπολογιζόμενα χρησιμοποιώντας το Πυθαγόρειο θεώρημα) από την αρχή // - σημεία με συντεταγμένες (0,0). Όσο πιο κοντά είναι τα σημεία στην αρχή // / - όσο μικρότεροι είναι Δεν απαιτούνται εκπομπές ρητού τύπου // Το πρότυπο έχει ρυθμιστεί να λειτουργεί με την κλάση Points. Compare(Points p1, Points p2) ( return (p1.R - p2.R); ) ) // Μετά την υλοποίηση της κατάλληλης διεπαφής TEMPLATE // το αντικείμενο COMPARER παρέχει την υλοποίηση του τυπικού // αλγόριθμου ταξινόμησης. class Class1 ( static void Main(string args) ( // Αντικείμενο γεννήτριας τυχαίων αριθμών. Random rnd = new Random(); int i; // Ουρά σημείων. Ουρά QP = νέα ουρά () // Απαριθμητής προτύπων. Σχεδιασμένο για να εξυπηρετεί // μια ουρά προτύπων στοιχείων της κλάσης Points.< 10; i++) { qP.Enqueue(new Points(rnd.Next(0, 10), rnd.Next(0, 10))); } enP = ((IEnumerableIEαριθμητής (pp, c);< 10; i++) qP.Enqueue(pp[i]); Console.WriteLine("========================================"); enP = ((IEnumerable) catch (Exception ex) ( Console.WriteLine(ex); ) // Η ταξινόμηση ολοκληρώθηκε, η ουρά αποκαταστάθηκε.

για (i = 0; i

)(qP)).GetEnumerator();

για (i = 0; enP.MoveNext(); i++) ( Console.WriteLine("(0): (1),(2)", i, enP.Current.x, enP.Current.y); ) Κονσόλα .WriteLine("============================================== =============== ");<>) ) ) Καταχώρηση 13.3.

Μηδενικοί τύποι

  • Οι μηδενικοί τύποι (απλοί μηδενικοί τύποι) είναι επεκτάσεις απλών τύπων. Οι δηλώσεις τους ανήκουν στον χώρο ονομάτων System.Nullable.
  • Αυτοί είναι τύποι προτύπων, δηλαδή τύποι που δημιουργήθηκαν ως αποτέλεσμα της τελειοποίησης των προτύπων. Μηδενιζόμενο πρότυπο
  • χρησιμοποιείται για την επέκταση απλών τύπων, που είναι ουσιαστικά δομές. Δύο συμβολισμοί χρησιμοποιούνται για να υποδηλώσουν τύπους που βασίζονται σε μηδενικά πρότυπα.
  • Κατά τη δημιουργία συναρτήσεων, μερικές φορές προκύπτουν καταστάσεις όπου δύο συναρτήσεις εκτελούν την ίδια επεξεργασία, αλλά λειτουργούν σε διαφορετικούς τύπους δεδομένων (για παράδειγμα, η μία χρησιμοποιεί παραμέτρους τύπου int και η άλλη τύπου float). Γνωρίζετε ήδη από το Μάθημα 13 ότι χρησιμοποιώντας την υπερφόρτωση συναρτήσεων, μπορείτε να χρησιμοποιήσετε το ίδιο όνομα για συναρτήσεις που κάνουν διαφορετικά πράγματα και έχουν διαφορετικούς τύπους παραμέτρων. Ωστόσο, εάν οι συναρτήσεις επιστρέφουν τιμές διαφορετικών τύπων, θα πρέπει να χρησιμοποιήσετε μοναδικά ονόματα για αυτές (δείτε τη σημείωση στο Μάθημα 13). Για παράδειγμα, ας υποθέσουμε ότι έχετε μια συνάρτηση με το όνομα max που επιστρέφει το μέγιστο των δύο ακέραιων τιμών. Εάν αργότερα χρειάζεστε μια παρόμοια συνάρτηση που επιστρέφει το μέγιστο των δύο τιμών κινητής υποδιαστολής, θα πρέπει να ορίσετε μια άλλη συνάρτηση, όπως fmax. Σε αυτό το σεμινάριο, θα μάθετε πώς να χρησιμοποιείτε πρότυπα C++ για να δημιουργείτε γρήγορα συναρτήσεις που επιστρέφουν τιμές διαφορετικών τύπων. Μέχρι το τέλος αυτού του μαθήματος, θα έχετε κατακτήσει τις ακόλουθες βασικές έννοιες:
  • Κατά τη διαδικασία μεταγλώττισης, ο μεταγλωττιστής C++ θα δημιουργήσει συναρτήσεις στο πρόγραμμά σας χρησιμοποιώντας τους τύπους που καθορίζονται στα πρωτότυπα συναρτήσεων που αναφέρονται στο όνομα του προτύπου.

Τα πρότυπα συναρτήσεων έχουν μια μοναδική σύνταξη που μπορεί να μην είναι ξεκάθαρη με την πρώτη ματιά. Ωστόσο, αφού δημιουργήσετε ένα ή δύο πρότυπα, θα διαπιστώσετε ότι είναι πραγματικά πολύ εύχρηστα.

ΔΗΜΙΟΥΡΓΗΣΤΕ ΕΝΑ ΑΠΛΟ ΠΡΟΤΥΠΟ ΛΕΙΤΟΥΡΓΙΩΝ

Ένα πρότυπο συνάρτησης ορίζει μια ανεξάρτητη από τον τύπο συνάρτηση. Με ένα τέτοιο πρότυπο, τα προγράμματά σας μπορούν στη συνέχεια να ορίσουν συγκεκριμένες συναρτήσεις με τους απαιτούμενους τύπους. Για παράδειγμα, το ακόλουθο πρότυπο ορίζεται για μια συνάρτηση με το όνομα max που επιστρέφει τη μεγαλύτερη από δύο τιμές:

πρότυπο T max(T a, T b)

{
if (a > b) return(a);
other return(b)?
}

Το γράμμα Τ σε αυτή την περίπτωση αντιπροσωπεύει έναν γενικό τύπο σχεδίου. Αφού ορίσετε ένα πρότυπο μέσα στο πρόγραμμά σας, δηλώνετε πρωτότυπα συναρτήσεων για κάθε τύπο που χρειάζεστε. Στην περίπτωση του προτύπου tach, τα ακόλουθα πρωτότυπα δημιουργούν συναρτήσεις τύπου float και int.

float max(float, float);
int max(int, int);

Όταν ο μεταγλωττιστής C++ συναντήσει αυτά τα πρωτότυπα, θα αντικαταστήσει το πρότυπο τύπου T με τον τύπο που καθορίζετε κατά την κατασκευή της συνάρτησης. Στην περίπτωση του τύπου float, η συνάρτηση max μετά την αντικατάσταση θα έχει την ακόλουθη μορφή:

πρότυπο T max(T a, T b)

{
if (a > b) return(a) ;
other return(b)?
}

float max(float a, float b)

{
if (a > b) return(a) ;
other return(b)?
}

Το ακόλουθο πρόγραμμα MAX_TEMP.CPP χρησιμοποιεί το μοτίβο max για να δημιουργήσει μια συνάρτηση τύπου int και float.

#περιλαμβάνω

πρότυπο T max(T a, T b)

{
if (a > b) return(a);
other return(b)?
}

float max(float, float);

int max(int, int);

{
cout<< «Максимум 100 и 200 равен » << max(100, 200) << endl;
cout<< «Максимум 5.4321 и 1.2345 равен » << max(5.4321, 1.2345) << endl;
}

Κατά τη μεταγλώττιση, ο μεταγλωττιστής C++ δημιουργεί αυτόματα εντολές για την κατασκευή μιας συνάρτησης που λειτουργεί στον τύπο int και μιας δεύτερης συνάρτησης που λειτουργεί στον τύπο float. Επειδή ο μεταγλωττιστής C++ διαχειρίζεται τους τελεστές που αντιστοιχούν στις συναρτήσεις που δημιουργείτε χρησιμοποιώντας πρότυπα, σας επιτρέπει να χρησιμοποιείτε τα ίδια ονόματα για συναρτήσεις που επιστρέφουν τιμές διαφορετικών τύπων. Δεν θα μπορούσατε να το κάνετε αυτό χρησιμοποιώντας μόνο την υπερφόρτωση συναρτήσεων, όπως συζητήθηκε στο Μάθημα 13.

Χρήση προτύπων συναρτήσεων

Καθώς τα προγράμματά σας γίνονται πιο περίπλοκα, μπορεί να υπάρχουν φορές που χρειάζεστε παρόμοιες λειτουργίες που εκτελούν τις ίδιες λειτουργίες αλλά σε διαφορετικούς τύπους δεδομένων. Ένα πρότυπο συνάρτησης επιτρέπει στα προγράμματά σας να ορίζουν μια γενική ή ανεξάρτητη από τον τύπο συνάρτηση. Όταν ένα πρόγραμμα χρειάζεται να χρησιμοποιήσει μια συνάρτηση σε έναν συγκεκριμένο τύπο, όπως int ή float, καθορίζει ένα πρωτότυπο συνάρτησης που χρησιμοποιεί το όνομα προτύπου συνάρτησης και τους τύπους επιστροφής και παραμέτρων. Κατά τη μεταγλώττιση, η C++ θα δημιουργήσει την κατάλληλη συνάρτηση. Δημιουργώντας πρότυπα, μειώνετε τον αριθμό των συναρτήσεων που πρέπει να κωδικοποιήσετε μόνοι σας και τα προγράμματά σας μπορούν να χρησιμοποιούν το ίδιο όνομα για συναρτήσεις που εκτελούν μια συγκεκριμένη λειτουργία, ανεξάρτητα από την τιμή επιστροφής και τους τύπους παραμέτρων της συνάρτησης.

ΠΡΟΤΥΠΑ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΟΥΝ ΠΟΛΛΑΠΛΟΥΣ ΤΥΠΟΥΣ

Ο προηγούμενος ορισμός προτύπου για τη συνάρτηση max χρησιμοποιούσε έναν μόνο γενικό τύπο, T. Πολύ συχνά, πρέπει να καθορίσετε πολλούς τύπους σε ένα πρότυπο συνάρτησης. Για παράδειγμα, οι παρακάτω προτάσεις δημιουργούν ένα πρότυπο για τη συνάρτηση show_array, το οποίο εμφανίζει τα στοιχεία ενός πίνακα. Το πρότυπο χρησιμοποιεί τον τύπο T για να υποδείξει τον τύπο του πίνακα και τον τύπο T1 για να υποδείξει τον τύπο της παραμέτρου count:

πρότυπο

{
Δείκτης T1;
για (δείκτης =0, ευρετήριο< count; index++) cout << array << ‘ ‘;
cout<< endl;
}

Όπως και πριν, το πρόγραμμα πρέπει να καθορίσει πρωτότυπα συναρτήσεων για τους απαιτούμενους τύπους:

void show_array(int *, int);
void show_array(float *, unsigned);

Το ακόλουθο πρόγραμμα SHOW_TEM.CPP χρησιμοποιεί ένα πρότυπο για τη δημιουργία συναρτήσεων που εξάγουν πίνακες τύπου int και τύπου float.

#περιλαμβάνω

πρότυπο void show_array (T * array, T1 count)

{
Δείκτης T1;
για (δείκτης =0, ευρετήριο< count; index++) cout << array “ ‘ ‘;
cout<< endl;
}

void show_array(int *, int);

void show_array(float *, unsigned);

{
int pages = ( 100, 200, 300, 400, 500 );
τιμές διακύμανσηςH = (10.05, 20.10, 30.15);
show_array(σελίδες, 5);
show_array(τιμές, 3);
}

Πρότυπα και πολλαπλοί τύποι

Καθώς τα πρότυπα συναρτήσεων γίνονται πιο πολύπλοκα, μπορούν να υποστηρίξουν πολλούς τύπους. Για παράδειγμα, το πρόγραμμά σας μπορεί να δημιουργήσει ένα πρότυπο για μια συνάρτηση που ονομάζεται array_sort που ταξινομεί τα στοιχεία ενός πίνακα. Σε αυτήν την περίπτωση, η συνάρτηση μπορεί να χρησιμοποιήσει δύο παραμέτρους: την πρώτη, που αντιστοιχεί στον πίνακα, και τη δεύτερη, που αντιστοιχεί στον αριθμό των στοιχείων του πίνακα. Εάν το πρόγραμμα αναμένει ότι ο πίνακας δεν θα περιέχει ποτέ περισσότερες από 32767 τιμές, μπορεί να χρησιμοποιήσει τον τύπο int για την παράμετρο μεγέθους πίνακα. Ωστόσο, ένα πιο γενικό μοτίβο μπορεί να επιτρέψει στο πρόγραμμα να καθορίσει τον δικό του τύπο για αυτήν την παράμετρο, όπως φαίνεται παρακάτω:

πρότυπο void array_sort (πίνακας T, στοιχεία T1)

{
// χειριστές
}

Χρησιμοποιώντας το πρότυπο array_sort, ένα πρόγραμμα μπορεί να δημιουργήσει συναρτήσεις που ταξινομούν μικρούς float πίνακες (λιγότερα από 128 στοιχεία) και πολύ μεγάλους πίνακες int χρησιμοποιώντας τα ακόλουθα πρωτότυπα:

void array_sort(float, char);
void array_sort(int, long);

ΤΙ ΠΡΕΠΕΙ ΝΑ ΞΕΡΕΤΕ

Όπως ήδη γνωρίζετε, η χρήση προτύπων συναρτήσεων μειώνει την προσπάθεια προγραμματισμού επιτρέποντας στον μεταγλωττιστή C++ να δημιουργεί δηλώσεις για συναρτήσεις που διαφέρουν μόνο ως προς τους τύπους και τις παραμέτρους επιστροφής. Στο Μάθημα 30, θα μάθετε πώς να χρησιμοποιείτε πρότυπα για τη δημιουργία κλάσεων ανεξάρτητων από τον τύπο ή γενικών κατηγοριών. Πριν μελετήσετε το Μάθημα 30, βεβαιωθείτε ότι έχετε κατακτήσει τις ακόλουθες βασικές έννοιες:

  1. Τα πρότυπα συναρτήσεων σάς επιτρέπουν να δηλώνετε συναρτήσεις ανεξάρτητες από τον τύπο ή γενικές.
  2. Όταν το πρόγραμμά σας χρειάζεται να χρησιμοποιήσει μια συνάρτηση με συγκεκριμένους τύπους δεδομένων, πρέπει να καθορίσει ένα πρωτότυπο συνάρτησης που καθορίζει τους απαιτούμενους τύπους.
  3. Όταν ο μεταγλωττιστής C++ συναντήσει ένα τέτοιο πρωτότυπο συνάρτησης, θα δημιουργήσει δηλώσεις που αντιστοιχούν σε αυτήν τη συνάρτηση, αντικαθιστώντας τους απαιτούμενους τύπους.
  4. Τα προγράμματά σας πρέπει να δημιουργούν πρότυπα για κοινές λειτουργίες που λειτουργούν σε διαφορετικούς τύπους. Με άλλα λόγια, εάν χρησιμοποιείτε μόνο έναν τύπο με μια συνάρτηση, δεν χρειάζεται να χρησιμοποιήσετε ένα πρότυπο.
  5. Εάν μια συνάρτηση απαιτεί πολλούς τύπους, το πρότυπο απλώς εκχωρεί σε κάθε τύπο ένα μοναδικό αναγνωριστικό, όπως T, T1 και T2. Αργότερα στη διαδικασία μεταγλώττισης, ο μεταγλωττιστής C++ θα αντιστοιχίσει σωστά τους τύπους που καθορίσατε στο πρωτότυπο της συνάρτησης.

Μάθημα 29. Χρήση προτύπων συναρτήσεων

Κατά τη δημιουργία συναρτήσεων, μερικές φορές προκύπτουν καταστάσεις όπου δύο συναρτήσεις εκτελούν την ίδια επεξεργασία, αλλά λειτουργούν σε διαφορετικούς τύπους δεδομένων (για παράδειγμα, η μία χρησιμοποιεί παραμέτρους τύπου int και η άλλη τύπου float). Γνωρίζετε ήδη από το Μάθημα 13 ότι χρησιμοποιώντας την υπερφόρτωση συναρτήσεων, μπορείτε να χρησιμοποιήσετε το ίδιο όνομα για συναρτήσεις που κάνουν διαφορετικά πράγματα και έχουν διαφορετικούς τύπους παραμέτρων. Ωστόσο, εάν οι συναρτήσεις επιστρέφουν τιμές διαφορετικών τύπων, θα πρέπει να χρησιμοποιήσετε μοναδικά ονόματα για αυτές (δείτε τη σημείωση στο Μάθημα 13). Για παράδειγμα, ας υποθέσουμε ότι έχετε μια συνάρτηση με το όνομα max που επιστρέφει το μέγιστο των δύο ακέραιων τιμών. Εάν αργότερα χρειάζεστε μια παρόμοια συνάρτηση που επιστρέφει το μέγιστο των δύο τιμών κινητής υποδιαστολής, θα πρέπει να ορίσετε μια άλλη συνάρτηση, όπως fmax. Σε αυτό το σεμινάριο, θα μάθετε πώς να χρησιμοποιείτε πρότυπα C++ για να δημιουργείτε γρήγορα συναρτήσεις που επιστρέφουν τιμές διαφορετικών τύπων. Μέχρι το τέλος αυτού του μαθήματος, θα έχετε κατακτήσει τις ακόλουθες βασικές έννοιες:

    Ένα πρότυπο ορίζει ένα σύνολο δηλώσεων που τα προγράμματά σας μπορούν αργότερα να χρησιμοποιήσουν για να δημιουργήσουν πολλαπλές συναρτήσεις.

    Τα προγράμματα χρησιμοποιούν συχνά πρότυπα συναρτήσεων για να ορίσουν γρήγορα πολλαπλές συναρτήσεις που χρησιμοποιούν τις ίδιες δηλώσεις για να λειτουργούν σε διαφορετικούς τύπους παραμέτρων ή έχουν διαφορετικούς τύπους επιστροφής.

    Τα πρότυπα συναρτήσεων έχουν συγκεκριμένα ονόματα που αντιστοιχούν στο όνομα της συνάρτησης που χρησιμοποιείτε στο πρόγραμμά σας.

    Μόλις το πρόγραμμά σας ορίσει ένα πρότυπο συνάρτησης, μπορεί στη συνέχεια να δημιουργήσει μια συγκεκριμένη συνάρτηση χρησιμοποιώντας αυτό το πρότυπο για να καθορίσει ένα πρωτότυπο που περιλαμβάνει το όνομα του προτύπου, την τιμή επιστροφής της συνάρτησης και τύπους παραμέτρων.

    Κατά τη διαδικασία μεταγλώττισης, ο μεταγλωττιστής C++ θα δημιουργήσει συναρτήσεις στο πρόγραμμά σας χρησιμοποιώντας τους τύπους που καθορίζονται στα πρωτότυπα συναρτήσεων που αναφέρονται στο όνομα του προτύπου.

Τα πρότυπα συναρτήσεων έχουν μια μοναδική σύνταξη που μπορεί να μην είναι ξεκάθαρη με την πρώτη ματιά. Ωστόσο, αφού δημιουργήσετε ένα ή δύο πρότυπα, θα διαπιστώσετε ότι είναι πραγματικά πολύ εύχρηστα.

ΔΗΜΙΟΥΡΓΗΣΤΕ ΕΝΑ ΑΠΛΟ ΠΡΟΤΥΠΟ ΛΕΙΤΟΥΡΓΙΩΝ

Ένα πρότυπο συνάρτησης ορίζει μια ανεξάρτητη από τον τύπο συνάρτηση. Με ένα τέτοιο πρότυπο, τα προγράμματά σας μπορούν στη συνέχεια να ορίσουν συγκεκριμένες συναρτήσεις με τους απαιτούμενους τύπους. Για παράδειγμα, το ακόλουθο πρότυπο ορίζεται για μια συνάρτηση με το όνομα max που επιστρέφει τη μεγαλύτερη από δύο τιμές:

πρότυπο T max(T a, T b)

(αν (α > β) επιστροφή(α); αλλιώς επιστροφή(β); )

Το γράμμα Τ σε αυτή την περίπτωση αντιπροσωπεύει έναν γενικό τύπο σχεδίου. Αφού ορίσετε ένα πρότυπο μέσα στο πρόγραμμά σας, δηλώνετε πρωτότυπα συναρτήσεων για κάθε τύπο που χρειάζεστε. Στην περίπτωση του προτύπου tach, τα ακόλουθα πρωτότυπα δημιουργούν συναρτήσεις τύπου float και int.

float max(float, float); int max(int, int);

Όταν ο μεταγλωττιστής C++ συναντήσει αυτά τα πρωτότυπα, θα αντικαταστήσει το πρότυπο τύπου T με τον τύπο που καθορίζετε κατά την κατασκευή της συνάρτησης. Στην περίπτωση του τύπου float, η συνάρτηση max μετά την αντικατάσταση θα έχει την ακόλουθη μορφή:

πρότυπο T max(T a, T b)

(αν (α > β) επιστροφή(α) ; αλλιώς επιστροφή(β); )

float max(float a, float b)

(αν (α > β) επιστροφή(α) ; αλλιώς επιστροφή(β); )

Το ακόλουθο πρόγραμμα MAX_TEMP.CPP χρησιμοποιεί το μοτίβο max για να δημιουργήσει μια συνάρτηση τύπου int και float.

#περιλαμβάνω

πρότυπο T max(T a, T b)

(αν (α > β) επιστροφή(α); αλλιώς επιστροφή(β); )

float max(float, float);

int max(int, int);

(cout<< "Максимум 100 и 200 равен " << max(100, 200) << endl; cout << "Максимум 5.4321 и 1.2345 равен " << max(5.4321, 1.2345) << endl; }

Κατά τη μεταγλώττιση, ο μεταγλωττιστής C++ δημιουργεί αυτόματα εντολές για την κατασκευή μιας συνάρτησης που λειτουργεί στον τύπο int και μιας δεύτερης συνάρτησης που λειτουργεί στον τύπο float. Επειδή ο μεταγλωττιστής C++ διαχειρίζεται τους τελεστές που αντιστοιχούν στις συναρτήσεις που δημιουργείτε χρησιμοποιώντας πρότυπα, σας επιτρέπει να χρησιμοποιείτε τα ίδια ονόματα για συναρτήσεις που επιστρέφουν τιμές διαφορετικών τύπων. Δεν θα μπορούσατε να το κάνετε αυτό χρησιμοποιώντας απλώς υπερφόρτωση συναρτήσεων, όπως συζητήθηκε στο Μάθημα 13.

Χρήση προτύπων συναρτήσεων

Καθώς τα προγράμματά σας γίνονται πιο περίπλοκα, μπορεί να υπάρχουν φορές που χρειάζεστε παρόμοιες λειτουργίες που εκτελούν τις ίδιες λειτουργίες αλλά σε διαφορετικούς τύπους δεδομένων. Ένα πρότυπο συνάρτησης επιτρέπει στα προγράμματά σας να ορίζουν μια γενική ή ανεξάρτητη από τον τύπο συνάρτηση. Όταν ένα πρόγραμμα χρειάζεται να χρησιμοποιήσει μια συνάρτηση σε έναν συγκεκριμένο τύπο, όπως int ή float, καθορίζει ένα πρωτότυπο συνάρτησης που χρησιμοποιεί το όνομα προτύπου συνάρτησης και τους τύπους επιστροφής και παραμέτρων. Κατά τη μεταγλώττιση, η C++ θα δημιουργήσει την κατάλληλη συνάρτηση. Δημιουργώντας πρότυπα, μειώνετε τον αριθμό των συναρτήσεων που πρέπει να κωδικοποιήσετε μόνοι σας και τα προγράμματά σας μπορούν να χρησιμοποιούν το ίδιο όνομα για συναρτήσεις που εκτελούν μια συγκεκριμένη λειτουργία, ανεξάρτητα από την τιμή επιστροφής και τους τύπους παραμέτρων της συνάρτησης.

ΠΡΟΤΥΠΑ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΟΥΝ ΠΟΛΛΑΠΛΟΥΣ ΤΥΠΟΥΣ

Ο προηγούμενος ορισμός προτύπου για τη συνάρτηση max χρησιμοποιούσε έναν μόνο γενικό τύπο, T. Πολύ συχνά, πρέπει να καθορίσετε πολλούς τύπους σε ένα πρότυπο συνάρτησης. Για παράδειγμα, οι παρακάτω προτάσεις δημιουργούν ένα πρότυπο για τη συνάρτηση show_array, το οποίο εμφανίζει τα στοιχεία ενός πίνακα. Το πρότυπο χρησιμοποιεί τον τύπο T για να υποδείξει τον τύπο του πίνακα και τον τύπο T1 για να υποδείξει τον τύπο της παραμέτρου count:

πρότυπο

< count; index++) cout << array << " "; cout << endl; }

Όπως και πριν, το πρόγραμμα πρέπει να καθορίσει πρωτότυπα συναρτήσεων για τους απαιτούμενους τύπους:

void show_array(int *, int); void show_array(float *, unsigned);

Το ακόλουθο πρόγραμμα SHOW_TEM.CPP χρησιμοποιεί ένα πρότυπο για τη δημιουργία συναρτήσεων που εξάγουν πίνακες τύπου int και τύπου float.

#περιλαμβάνω

πρότυπο void show_array (T * array, T1 count)

( Δείκτης T1; για (δείκτης =0; ευρετήριο< count; index++) cout << array “ " "; cout << endl; }

void show_array(int *, int);

void show_array(float *, unsigned);

( int pages = ( 100, 200, 300, 400, 500 ); float τιμές H = ( 10.05, 20.10, 30.15); show_array(σελίδες, 5); show_array(τιμές, 3); )

Πρότυπα και πολλαπλοί τύποι

Καθώς τα πρότυπα συναρτήσεων γίνονται πιο πολύπλοκα, μπορούν να υποστηρίξουν πολλούς τύπους. Για παράδειγμα, το πρόγραμμά σας μπορεί να δημιουργήσει ένα πρότυπο για μια συνάρτηση που ονομάζεται array_sort που ταξινομεί τα στοιχεία ενός πίνακα. Σε αυτήν την περίπτωση, η συνάρτηση μπορεί να χρησιμοποιήσει δύο παραμέτρους: την πρώτη, που αντιστοιχεί στον πίνακα, και τη δεύτερη, που αντιστοιχεί στον αριθμό των στοιχείων του πίνακα. Εάν το πρόγραμμα αναμένει ότι ο πίνακας δεν θα περιέχει ποτέ περισσότερες από 32767 τιμές, μπορεί να χρησιμοποιήσει τον τύπο int για την παράμετρο μεγέθους πίνακα. Ωστόσο, ένα πιο γενικό μοτίβο μπορεί να επιτρέψει στο πρόγραμμα να καθορίσει τον δικό του τύπο για αυτήν την παράμετρο, όπως φαίνεται παρακάτω:

πρότυπο Τ , class T1> void array_sort(πίνακας T, στοιχεία T1)

( // χειριστές )

Χρησιμοποιώντας το πρότυπο array_sort, ένα πρόγραμμα μπορεί να δημιουργήσει συναρτήσεις που ταξινομούν μικρούς float πίνακες (λιγότερα από 128 στοιχεία) και πολύ μεγάλους πίνακες int χρησιμοποιώντας τα ακόλουθα πρωτότυπα:

void array_sort(float, char); void array_sort(int, long);

ΤΙ ΠΡΕΠΕΙ ΝΑ ΞΕΡΕΤΕ

Όπως ήδη γνωρίζετε, η χρήση προτύπων συναρτήσεων μειώνει την προσπάθεια προγραμματισμού επιτρέποντας στον μεταγλωττιστή C++ να δημιουργεί δηλώσεις για συναρτήσεις που διαφέρουν μόνο ως προς τους τύπους και τις παραμέτρους επιστροφής. Στο Μάθημα 30, θα μάθετε πώς να χρησιμοποιείτε πρότυπα για τη δημιουργία κλάσεων ανεξάρτητων από τον τύπο ή γενικών κατηγοριών. Πριν μελετήσετε το Μάθημα 30, βεβαιωθείτε ότι έχετε κατακτήσει τις ακόλουθες βασικές έννοιες:

      Τα πρότυπα συναρτήσεων σάς επιτρέπουν να δηλώνετε συναρτήσεις ανεξάρτητες από τον τύπο ή γενικές.

      Όταν το πρόγραμμά σας χρειάζεται να χρησιμοποιήσει μια συνάρτηση με συγκεκριμένους τύπους δεδομένων, πρέπει να καθορίσει ένα πρωτότυπο συνάρτησης που καθορίζει τους απαιτούμενους τύπους.

      Όταν ο μεταγλωττιστής C++ συναντήσει ένα τέτοιο πρωτότυπο συνάρτησης, θα δημιουργήσει δηλώσεις που αντιστοιχούν σε αυτήν τη συνάρτηση, αντικαθιστώντας τους απαιτούμενους τύπους.

      Τα προγράμματά σας πρέπει να δημιουργούν πρότυπα για κοινές λειτουργίες που λειτουργούν σε διαφορετικούς τύπους. Με άλλα λόγια, εάν χρησιμοποιείτε μόνο έναν τύπο με μια συνάρτηση, δεν χρειάζεται να χρησιμοποιήσετε ένα πρότυπο.

      Εάν μια συνάρτηση απαιτεί πολλούς τύπους, το πρότυπο απλώς εκχωρεί σε κάθε τύπο ένα μοναδικό αναγνωριστικό, όπως T, T1 και T2. Αργότερα στη διαδικασία μεταγλώττισης, ο μεταγλωττιστής C++ θα αντιστοιχίσει σωστά τους τύπους που καθορίσατε στο πρωτότυπο της συνάρτησης.



Συνιστούμε να διαβάσετε

Μπλουζα