English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Manuale di riferimento C++
In questo articolo, imparerai i template in C++. Imparerai come utilizzare le funzionalità dei template per la programmazione universale.
I template sono una funzionalità potente di C++ che ti permette di scrivere programmi universali. In breve, puoi creare una funzione o una classe che gestisce diversi tipi di dati utilizzando i template.
I template sono spesso utilizzati in grandi codebase, con lo scopo di realizzare la riutilizzabilità del codice e la flessibilità del programma.
Il concetto di template può essere utilizzato in due modi diversi:
Modelli di classe
template di funzioneIl funzionamento del template di funzione è simile a quello delle funzioni normalifunzione
Simile, ma c'è una differenza.
Di solito, se si devono eseguire le stesse operazioni su due o più tipi di dati, si può creare due funzioni con dichiarazioni di funzione richieste utilizzando funzioni sovraccaricate.
Ma un metodo migliore è l'uso di template di funzione, perché si può eseguire la stessa attività con meno codice.
I template di funzione iniziano con la parola chiave template, seguita da <> contenenti i parametri del template, quindi dalla dichiarazione della funzione.
template <class T> T someFunction(T arg) { ... .. ... }
Nell'esempio sopra, T è un parametro di modello che accetta diversi tipi di dati (come int, float, ecc.), mentreclassè una parola chiave.
Nell'esempio sopra, è possibile utilizzare anche la parola chiave typename al posto di class.
Quando si passano parametri di tipo dati alla someFunction(), il compilatore genera una nuova versione di someFunction() per il tipo dati specificato.
Il programma utilizza la funzione template per visualizzare il numero maggiore tra due numeri.
// se due caratteri vengono passati alla funzione template, viene visualizzato il carattere con il valore ASCII maggiore. #include <iostream> using namespace std; // template function template <class T> T Large(T n1, T n2) { return (n1 > n2) ? n1 : n2; } int main() { int i1, i2; float f1, f2; char c1, c2; cout << "输入两个整数:\n"; cin >> i1 >> i2; cout << Large(i1, i2) << " 更大。" << endl; cout << "\n输入两个浮点数:\n"; cin >> f1 >> f2; cout << Large(f1, f2) << " 更大。" << endl; cout << "\n输入两个字符:\n"; cin >> c1 >> c2; cout << Large(c1, c2) << " 具有较大的ASCII值。"; return 0; }
Output dei risultati
输入两个整数: 5 10 10 è maggiore. 输入两个浮点数: 12.4 10.2 12.4 è maggiore. 输入两个字符: z Z z 具有较大的ASCII值。
在上面的程序中,定义了一个函数模板Large(),它接受数据类型为T的两个参数n1和n2。T表示这个参数可以是任何数据类型。
Large()函数使用简单的条件操作返回两个参数中最大的一个。
在main()函数内部,声明了三种不同数据类型的变量:int,float和char。然后将变量作为普通函数传递给Large()函数模板。
在运行时,将整数传递给模板函数时,编译器知道必须生成一个Large()函数来接受int参数,并且也是这样做的。
同样,当传递浮点数据和char数据时,它知道自变量数据类型并相应地生成Large()函数。
这样,仅使用一个函数模板即可替换三个相同的常规函数,并使您的代码更少也更容易维护。
程序使用函数模板交换数据。
#include <iostream> using namespace std; template <typename T> 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 << "在将数据传递给函数模板之前。\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "\n\n将数据传递给函数模板后。\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; return 0; }
Output dei risultati
在将数据传递给函数模板之前。 i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Dopo aver passato i dati alla funzione modello. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
In questo programma, non si chiama la funzione passando il valore, maTramite riferimentoEseguire la chiamata.
La funzione modello Swap() accetta due parametri e li scambia tramite riferimento.
Come i modelli di funzione, è possibile creare modelli di classe per operazioni di classe universali.
A volte, è necessario avere un'implementazione di classe per tutte le classi, ma con tipi di dati diversi.
Di solito, è necessario creare una classe diversa per ogni tipo di dati, o creare diversi membri variabili e funzioni in una classe.
Questo aggiungerà molto codice simile e sarà difficile da mantenere.
Ma il modello di classe rende più facile riutilizzare lo stesso codice per tutti i tipi di dati.
template <class T> class className { ... .. ... public: T var; T someOperation(T arg); ... .. ... };
Nella dichiarazione sopra, T è il parametro del modello, che è un segnaposto per il tipo di dati utilizzato.
All'interno della classe, le variabili membro var e la funzione membro someOperation() sono entrambe di tipo T.
Per creare un oggetto modello di classe, è necessario definire il tipo di dati tra < > durante la creazione.
className<dataType> classObject;
Ad esempio:
className<int> classObject; className<float> classObject; className<string> classObject;
Il programma utilizza il modello di classe per eseguire operazioni di addizione, sottrazione, moltiplicazione e divisione tra due numeri
#include <iostream> using namespace std; template <class T> class Calculator { private: T num1, num2; public: Calculator(T n1, T n2) { num1 = n1; num2 = n2; } void displayResult() { cout << "Numeri sono: " << num1 << " e " << num2 << "." << endl; cout << "Addizione è: " << add() << endl; cout << "Sottrazione è: " << subtract() << endl; cout << "Prodotto è: " << multiply() << endl; cout << "Divisione è: " << 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<int> intCalc(2, 1); Calculator<float> floatCalc(2.4, 1.2); cout << "Risultati di tipo int:" << endl; intCalc.displayResult(); cout << endl << "Risultati di tipo float:" << endl; floatCalc.displayResult(); return 0; }
Output dei risultati
Risultati di tipo int: I numeri sono: 2 e 1. La somma è: 3 La sottrazione è: 1 Il prodotto è: 2 La divisione è: 2 Risultati di tipo float: I numeri sono: 2.4 e 1.2. La somma è: 3.6 La sottrazione è: 1.2 Il prodotto è: 2.88 La divisione è: 2
Nel programma sopra, è stata dichiarata una classe template Calculator.
La classe contiene due membri privati di tipo T: num1 e num2, e un costruttore per inizializzare i membri.
Contiene anche funzioni membri pubbliche per calcolare la somma, la sottrazione, la moltiplicazione e la divisione dei numeri, restituendo il valore del tipo di dati definito dall'utente. Allo stesso modo, la funzione displayResult() esegue l'output del risultato finale sullo schermo.
Nel funzione main(), sono stati creati due oggetti Calculator diversi per i tipi di dati, intCalc e floatCalc: int e float. Utilizza il costruttore per inizializzare i valori.
Attenzione, stiamo usando <int> e <float> per creare oggetti. Questo informa il compilatore del tipo di dati utilizzato per la creazione della classe.
Questo creerà una definizione di classe per int e float rispettivamente, e poi li userà corrispondentemente.
Poi, vengono chiamati questi due oggetti displayResult(),
Poi, chiamare questi due oggetti displayResult(), che eseguono l'operazione del calcolatore e mostrano l'output.