第9章多态性 9.1函数模板 9.2模板函数的覆盖 9.3类模板
第9章 多态性 9.1 函数模板 9.2 模板函数的覆盖 9.3 类模板
第9章模板 9.1函数模板 1问题的提出 重载函数可以解决功能相同或相似的函数使用同一个函数名 的问题。 void swap(char &x, char &y) void swap(float &x, float &y) char t=x: float t =x; y X t; y= t; void swap(int &x, int &y) intt=x. 实际代码量并未 减少。可使用函数模 X=y, 板减少大量代码。 =t;
9.1 函数模板 1. 问题的提出 重载函数可以解决功能相同或相似的函数使用同一个函数名 的问题。 void swap(char &x, char &y) { char t =x; x = y; y = t; } void swap(int &x, int &y) { int t =x; x = y; y = t; } 第9章 模板 void swap(float &x, float &y) { float t =x; x = y; y = t; } 实际代码量并未 减少。可使用函数模 板减少大量代码
第9章模板 9.1函数模板 2.函数模板的定义 template 或 template 类型名函数名(参数表) 类型名函数名(参数表) 函数体 函数体 函数模板就像是一个带有类型参数的函数(参数T即为类型), 编译程序会根据实际参数的类型确定参数的类型
9.1 函数模板 2. 函数模板的定义 template 或 类型名 函数名(参数表) { 函数体 } 函数模板就像是一个带有类型参数的函数(参数T即为类型), 编译程序会根据实际参数的类型确定参数的类型。 第9章 模板 template 类型名 函数名(参数表) { 函数体 }
第9章模板 例9.1定义用于变量交换的函数模板 include template void swap(T &x, T&y) T temp=x: X y=temp void main ( void) T本身是一个类型参数,在调用函 char a=A, b=B 数swap()时,编译程序会根据 intc=123,d=456; 实际参数的类型确定T的类型。 double x=12.3, y=45.6 swap(a, b); swap(c, d); swap(x, y) 程序运行结果为: cout <s a<<"<< b<< end: BA cout <<c<<<<d<< end: cout≤x<","≤<y<<endl; 456.123 45.6.12.3
例9.1 定义用于变量交换的函数模板 #include template void swap(T &x, T &y) { T temp=x; x=y; y=temp; } void main(void) { char a='A', b='B'; int c=123, d=456; double x=12.3, y=45.6; swap(a, b); swap(c, d); swap(x, y); cout << a << "," << b << endl; cout << c << "," << d << endl; cout << x << "," << y << endl; } 第9章 模板 程序运行结果为: B, A 456, 123 45.6, 12.3 T本身是一个类型参数,在调用函 数swap()时,编译程序会根据 实际参数的类型确定T的类型
第9章模板 例9.2插入排序函数模板,使用插入排序函数模板可以为不 同数据类型的数组排序,如整型、字符型、实型等等,为了使 程序具有通用性,设计函数模板 Insertion Sort()。 插入排序的基本思想:每一步将一个待排序的元素按其关键字值的大小 插入到已排序序列的合适位置,直到待排序元素全部插入完为止。 a[0] 2→2 a[1] [2] a[3] 85243 8243 5843 24583 23458 a[4]
例9.2 插入排序函数模板,使用插入排序函数模板可以为不 同数据类型的数组排序,如整型、字符型、实型等等,为了使 程序具有通用性,设计函数模板InsertionSort()。 插入排序的基本思想:每一步将一个待排序的元素按其关键字值的大小 插入到已排序序列的合适位置,直到待排序元素全部插入完为止。 第9章 模板
第9章模板 例92(续一) template void Insertion SortT Al, int n) int 1, T temp for(i=1; i0&&temp≤A[-们) ∥遇到temp>≡AU-们结束循环时,j便是应插入的位置 ∥遇到==0结束循环时,则0是应插入的位置 A]=A-];∥将元素逐个后移,以便找到插入位置时可立即插入。 A0= temp;
例9.2 (续一) template void InsertionSort(T A[], int n) { int i, j; T temp; for (i = 1; i 0 && temp =A[j-1]结束循环时,j便是应插入的位置 //当遇到j==0结束循环时,则0是应插入的位置。 A[j] = A[j-1]; //将元素逐个后移,以便找到插入位置时可立即插入。 j--; } A[j] = temp; } } 第9章 模板
第9章模板 例92(续二) include void maino inta[10]={2,4,187,9,0356} double b[10]={121,242,15.5,817,27,59,403,333,256,4.6}; Insertion Sort(a, 10); Insertion Sort(b, 10); cout≤a<""≤可1<<""≤a[2]<""≤a3<""; cout < a4<<""a5""a6]<""κ叫" cout < a[8] a[9]<<endl; cout<b[0]<""<b1<<""<b[2]<""<b[3]<" cout<bp4]""sb5]""≤<b6]<""≤b7]<""; cout < b[8]<<<< b[9]<<endl; 程序运行结果为: 0123456789 2.74.65.912.115.524.225.633.340.381.7
例9.2 (续二) #include void main() { int a[10]={2,4,1,8,7,9,0,3,5,6}; double b[10]={12.1, 24.2, 15.5, 81.7, 2.7, 5.9, 40.3, 33.3, 25.6, 4.6}; InsertionSort(a,10); InsertionSort(b,10); cout << a[0] << " " << a[1]<< " " << a[2] << " " << a[3] << " "; cout << a[4] << " " << a[5]<< " " << a[6] << " " << a[7] << " "; cout << a[8] << " " << a[9]<< endl; cout << b[0] << " " << b[1]<< " " << b[2] << " " << b[3] << " "; cout << b[4] << " " << b[5]<< " " << b[6] << " " << b[7] << " "; cout << b[8] << " " << b[9]<< endl; } 第9章 模板 程序运行结果为: 0 1 2 3 4 5 6 7 8 9 2.7 4.6 5.9 12.1 15.5 24.2 25.6 33.3 40.3 81.7
第9章模板 例9.3使用函数模板产生的二意性 include template T max(T a, T b) 产生二意性,系统不能确定将其中的 return a>b?a: b: 个参数由整数转化为实数,还是应该将 另一个参数由实数转化为整数 void main(void) 可使用强制类型转换解决 int a =max( (int)10.5, 20); inta=max(10.5,20); double b=max((double)10, 20.6); double b=max(10, 20.6); cout<≤a<<endl; cout < b<< endl 返回
例9.3 使用函数模板产生的二意性 #include template T max(T a, T b) { return a>b?a:b; } void main(void) { int a = max(10.5, 20); double b = max(10, 20.6); cout << a << endl; cout << b << endl; } 第9章 模板 产生二意性,系统不能确定将其中的一 个参数由整数转化为实数,还是应该将 另一个参数由实数转化为整数。 可使用强制类型转换解决: int a =max( (int)10.5, 20); double b =max( (double ) 10, 20.6); 返 回
第9章模板 」9.2模板函数的覆盖 下列函数模板: template T max(T a, T b) retum a>b?a: b 对于简单的数据类型,如整型、实型、字符型数据,这个模 板能够正常工作。对于字符串,用上述模板就会出现问题,因为 对于字符串,不能使用运算符“>”,要为其编写独立的max()函 数 我们将函数模板生成的函数称为模板函数。如果某一函数的 函数原型与函数模板生成的函数(模板函数)原型一致,称该函 数为模板函数的覆盖函数
9.2 模板函数的覆盖 下列函数模板: template T max(T a, T b) { retum a>b?a:b; } 对于简单的数据类型,如整型、实型、字符型数据,这个模 板能够正常工作。对于字符串,用上述模板就会出现问题,因为 对于字符串,不能使用运算符“>”,要为其编写独立的max()函 数。 我们将函数模板生成的函数称为模板函数。如果某一函数的 函数原型与函数模板生成的函数(模板函数)原型一致,称该函 数为模板函数的覆盖函数。 第9章 模板
第9章模板 例9.4模板函数的覆盖 Include #include template T max(T a, T b) return a>b?a: b char *max(char x, char*y return strcmp(x, y)>0?x void main(void) char *p=ABCD,*q=" EFGH"; p=max(p, g) int a=max (10, 20 float b=max(10.5, 20.6); 程序运行结果为 cout<<p≤≤endl; EFGH cout < a < end: cout≤≤b<<end; 20.6
例9.4 模板函数的覆盖 #include #include template T max(T a, T b) { return a>b?a:b; } char *max(char *x, char *y) { return strcmp(x, y) > 0 ? x :y; } void main(void) { char *p="ABCD", *q="EFGH"; p=max(p, q); int a =max(10, 20); float b =max(10.5, 20.6); cout << p << endl; cout << a << endl; cout << b << endl; } 第9章 模板 程序运行结果为: EFGH 20 20.6