Πρότυπα C ++

Σε αυτό το άρθρο, θα μάθετε για τα πρότυπα στο C ++. Θα μάθετε να χρησιμοποιείτε τη δύναμη των προτύπων για γενικό προγραμματισμό.

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

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

Η έννοια των προτύπων μπορεί να χρησιμοποιηθεί με δύο διαφορετικούς τρόπους:

  • Πρότυπα συναρτήσεων
  • Πρότυπα τάξης

Πρότυπα συναρτήσεων

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

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

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

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

Πώς να δηλώσετε ένα πρότυπο λειτουργίας;

Ένα πρότυπο συνάρτησης ξεκινά με το πρότυπο λέξης-κλειδιού ακολουθούμενο από παράμετρο προτύπου μέσα στο οποίο ακολουθείται από δήλωση συνάρτησης.

 πρότυπο < class T> T someFunction (T arg) (…)

Στον παραπάνω κώδικα, το T είναι ένα όρισμα προτύπου που δέχεται διαφορετικούς τύπους δεδομένων (int, float) και η κλάση είναι μια λέξη-κλειδί.

Μπορείτε επίσης να χρησιμοποιήσετε λέξη-κλειδί typenameαντί για κλάση στο παραπάνω παράδειγμα.

Όταν, μεταβιβάζεται ένα όρισμα ενός τύπου δεδομένων someFunction( ), ο μεταγλωττιστής δημιουργεί μια νέα έκδοση του someFunction()δεδομένου τύπου δεδομένων.

Παράδειγμα 1: Πρότυπο λειτουργίας για να βρείτε τον μεγαλύτερο αριθμό

Πρόγραμμα για την εμφάνιση μεγαλύτερου μεταξύ δύο αριθμών χρησιμοποιώντας πρότυπα λειτουργιών.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Παραγωγή

Εισαγάγετε δύο ακέραιους αριθμούς: 5 10 10 είναι μεγαλύτερο. Εισαγάγετε δύο αριθμούς κινητής υποδιαστολής: 12.4 10.2 12.4 είναι μεγαλύτερο. Εισαγάγετε δύο χαρακτήρες: z Z z έχει μεγαλύτερη τιμή ASCII.

Στο παραπάνω πρόγραμμα, Large()ορίζεται ένα πρότυπο λειτουργίας που δέχεται δύο ορίσματα n1 και n2 τύπου δεδομένων T. Tσημαίνει ότι το όρισμα μπορεί να είναι οποιουδήποτε τύπου δεδομένων.

Large() Η συνάρτηση επιστρέφει το μεγαλύτερο από τα δύο ορίσματα χρησιμοποιώντας μια απλή υπό όρους λειτουργία.

Στο εσωτερικό του main()λειτουργία, οι μεταβλητές των τριών διαφορετικών τύπων δεδομένων: int, floatκαι charδηλώνονται. Οι μεταβλητές στη συνέχεια μεταβιβάζονται στο Large()πρότυπο συνάρτησης ως κανονικές συναρτήσεις.

Κατά τη διάρκεια του χρόνου εκτέλεσης, όταν ένας ακέραιος μεταφέρεται στη συνάρτηση προτύπου, ο μεταγλωττιστής γνωρίζει ότι πρέπει να δημιουργήσει μια Large()συνάρτηση για να αποδεχτεί τα int επιχειρήματα και το κάνει.

Ομοίως, όταν διαβιβάζονται δεδομένα κινητής υποδιαστολής και δεδομένα char, γνωρίζει τους τύπους δεδομένων ορίσματος και δημιουργεί τη Large()συνάρτηση ανάλογα.

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

Παράδειγμα 2: Ανταλλαγή δεδομένων χρησιμοποιώντας πρότυπα λειτουργιών

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

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Παραγωγή

Πριν από τη μετάδοση δεδομένων στο πρότυπο λειτουργίας. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Μετά τη μετάδοση δεδομένων στο πρότυπο λειτουργίας. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = α

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

Το Swap()πρότυπο συνάρτησης λαμβάνει δύο ορίσματα και τα ανταλλάσσει με αναφορά.

Πρότυπα τάξης

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

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

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

Αυτό θα καταστρέψει άσκοπα τη βάση κώδικα και θα είναι δύσκολο να διατηρηθεί, καθώς μια αλλαγή είναι μία κλάση / λειτουργία πρέπει να εκτελείται σε όλες τις τάξεις / λειτουργίες.

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

Πώς να δηλώσετε ένα πρότυπο τάξης;

 πρότυπο < class T> class className (… public: T var; T someOperation (T arg);…);

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

Μέσα στο σώμα της τάξης, μια μεταβλητή μέλους και μια συνάρτηση μέλους someOperation()είναι και οι δύο τύπου T.

Πώς να δημιουργήσετε ένα αντικείμενο προτύπου κλάσης;

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

 className classObject; 

Για παράδειγμα:

className classObject; className classObject; className classObject;

Παράδειγμα 3: Απλή αριθμομηχανή χρησιμοποιώντας πρότυπο κλάσης

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

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Παραγωγή

Int αποτελέσματα: Οι αριθμοί είναι: 2 και 1. Η προσθήκη είναι: 3 Η αφαίρεση είναι: 1 Το προϊόν είναι: 2 Το τμήμα είναι: 2 Αποτελέσματα Float: Οι αριθμοί είναι: 2.4 και 1.2. Η προσθήκη είναι: 3.6 Η αφαίρεση είναι: 1.2 Το προϊόν είναι: 2.88 Το τμήμα είναι: 2

Στο παραπάνω πρόγραμμα, Calculatorδηλώνεται ένα πρότυπο κλάσης .

Η τάξη περιέχει δύο ιδιωτικά μέλη του τύπου T: num1 & num2, και έναν κατασκευαστή για την ακινητοποίηση των μελών.

It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult() to display the final output to the screen.

In the main() function, two different Calculator objects intCalc and floatCalc are created for data types: int and float respectively. The values are initialized using the constructor.

Notice we use and while creating the objects. These tell the compiler the data type used for the class creation.

This creates a class definition each for int and float, which are then used accordingly.

Στη συνέχεια, displayResult()καλείται και από τα δύο αντικείμενα που εκτελεί τις λειτουργίες της Αριθμομηχανής και εμφανίζει την έξοδο.

ενδιαφέροντα άρθρα...