|
一、类模板的引出: 1、在c++中是否能够将泛型的思想应用在类上呢? 我们在前面的两篇文章里面,对函数模板有了一个清楚的认识,作为类比学习,当然泛型的思想是可以应用到类上的。 2、类模板:
3、C++中的模板: 以相同的方式处理不同的类型 在类声明前使用template进行标识 template < typename T >//T表示泛指类型class Operator {/ \/ w. _" Z' b8 A2 M public: T op(T a , T b); };6 i) z) K; z( J' ^ 4、类模板的应用
Operator<int> op1;. w& n4 ? n+ q/ C Operator<string> op2; 4 x2 F* X5 S2 R" Y' p6 u" w int i = op1.op(1,2);. k- }+ M: A# a' U! w string s = op2.op("txp","C++"); 8 _9 p1 {; F; I$ x# |# I0 _2 G2 H
-从类模板通过具体类型产生不同的类 -在声明的地方对类模板代码本身进行编译 -在使用的地方对参数替换后代码进行编译 代码实践: #include <iostream> s2 G; N% r& b+ c* ~% G% i7 m#include <string> K* y% l$ y. c# ` @; G3 A using namespace std; template < typename T >& z9 ^& U5 Q( j9 W class Operator { public: T add(T a, T b) { return a + b;( } |# J8 H! v: R. s; C } T minus(T a, T b)7 ^( P+ `) E3 L {* d. N+ ~( d( h6 t5 F) Z return a - b; } T multiply(T a, T b)7 x2 T7 G3 ^4 g {9 ~( V- N4 [, Q$ M% {9 H return a * b;6 J! s: ~7 b0 R# y* V! i e }6 j8 R5 z x8 m/ N9 O$ l, t# n, }2 E T divide(T a, T b) {6 A- f) A. c$ O return a / b;) O3 \8 j% y" y) Y* v8 t } };( t6 n! h+ \" G string operator-(string& l, string& r)// 全局函数方式重载 - 操作符,编译通过;先类内部、再全局 { return "Minus";! }; S% Z6 c3 Q1 u) U! `2 j } 5 j g3 ~! p% F% s/ x, \' M int main() {6 b E: }; n$ W* { Operator<int> op1;) H* `, }- f8 E) P4 ] R5 [* l8 u6 ? cout << op1.add(1, 2) << endl; Operator<string> op2; // 第二次使用类模板时进行编译,但是并不是对所有模板中的函数进行了第二次编译,是分步编译的,首先编译的是构造函数,此时用的是默认的,没有问题,这里编译通过; cout << op2.add("Txp", "C++") << endl;4 x; T% K, ?8 F# b cout << op2.minus("Txp", "C++") << endl; // 如果没有定义全局的重载 - 操作符的函数时,字符串相减没有定义,报错;这里报错展示出来是为了证明类模板编译也是经过了两次编译;这里编译器针对 minus() 函数进行第二次编译;定义全局的重载 - 操作符函数后,打印 Minus ; return 0;/ }7 }. ?; s7 N3 C } & W4 v" e2 B5 e* A- [ 输出结果: root@txp-virtual-machine:/home/txp# ./a.out3 TxpC++) a3 ]# q2 s! \5 m2 T Minux ) Z0 a( Y2 H8 I% x9 E, D 5、类模板的工程应用
代码实践: Operator.h头文件: #ifndef _OPERATOR_H_#define _OPERATOR_H_ template < typename T > class Operator" H' H' w/ n2 n( {: f {& C: w- l+ C1 y6 q public: T add(T a, T b); T minus(T a, T b); T multiply(T a, T b); T divide(T a, T b);1 {# `' b3 m1 |- R* D% F }; 5 k* o7 D) |& _ template < typename T >' @" h5 D8 o" K9 D T Operator<T>::add(T a, T b)& s) i. {; M3 f1 [ { R$ Z2 z4 G# A4 I. ]1 T A- q8 T/ R! v return a + b; }5 d/ Y/ ]5 p1 T& i , G3 F6 _: O- I" B9 c1 C) t" b template < typename T > T Operator<T>::minus(T a, T b): @! \/ G y9 g! ? { return a - b; }, G2 h& ]% q; j7 L9 D$ ? ' _5 }& `8 x9 D. r! L I) E; f8 q j1 f, S7 u+ V3 b template < typename T > T Operator<T>::multiply(T a, T b)0 X( |1 L( N; x% `8 d q {; v. k* d* d3 U) Q6 z return a * b; }' }+ Y# V/ h5 p( j + @. I' Y5 |# u; ~8 c7 z( `( c template < typename T > T Operator<T>::divide(T a, T b) {! ^+ Z: U' H; F return a / b;4 G9 B! X3 W! Z3 @) h }) q3 \) {5 j; J1 O/ k* _ #endif test.cpp文件: #include <iostream>- ]8 m. [4 ?1 J9 P9 ~#include <string>3 B G- @- {3 G* H #include "Operator.h" using namespace std;; S9 \' ^+ o9 M2 c- H# @' k & R2 L) L4 m7 `2 U X 6 `1 l8 T8 l1 d, W; H6 l int main() { Operator<int> op1; % U/ E% \% B) u$ I: U' b! G, o cout << op1.add(1, 2) << endl;" B* O- z5 a; d3 L6 v, u cout << op1.multiply(4, 5) << endl; cout << op1.minus(5, 6) << endl;& \1 U: R8 l- N# t! t cout << op1.divide(10, 5) << endl;$ H$ F% H9 d5 f1 i 0 S' ]# I2 x5 m3 j: b) T; h return 0; }, n' c0 q) J& H" `+ [# {0 F- ^ + s$ s V) s0 a5 h0 E5 r 输出结果: root@txp-virtual-machine:/home/txp# ./a.out3 20+ b- `( h3 n7 \( F( {/ ]- s -1* B( i+ R( I, U 2, }/ |# [! @+ b* d N9 S 二、总结:
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 * A/ [& r/ {2 G# |8 n |
微信公众号
手机版