u:57 第九章模板 本章主要内容 1.模板的概念 2.函数模板 3.类模板 4.容器与迭代子
21:17:57 第九章 模 板 本章主要内容 1. 模板的概念 2. 函数模板 3. 类模板 4. 容器与迭代子
u:57 §1模板的概念 模板用于表达逻辑结构相同,但具体数据元素类型不同的 数据对象的通用行为,是开发大型软件、建立通用函数库 和类库的强有力的工具 类属机制:把函数或类要处理的数据类型参数化,表现为 参数的多态性 C++中有两种模板 1.函数模板 2.类模板
21:17:57 §1 模板的概念 ➢ 模板用于表达逻辑结构相同,但具体数据元素类型不同的 数据对象的通用行为,是开发大型软件、建立通用函数库 和类库的强有力的工具 ➢ 类属机制:把函数或类要处理的数据类型参数化,表现为 参数的多态性 ➢C++中有两种模板 1. 函数模板 2. 类模板
模板存在的必要性 1.函数重载 int abs(int x return x>0?x:-x double abs (double x return x>0?x: -; long abs(long x)return x>0?x: -x; K int maino cout < abs (10)<< ends < abs(-10. 5)<< ends <abs(-1000000L)<<endl return 0 重载的多个函数只是处理的数据的类型不一样,除此之外, 其它操作完全一样,但针对每种数据类型都必须实现一个函 数完成相应的操作
21:17:57 模板存在的必要性 int abs(int x){return x>0?x:-x;} double abs(double x){return x>0?x:-x;} long abs(long x){return x>0?x:-x;} int main(){ cout << abs(-10) << ends << abs(-10.5) << ends << abs(-1000000L) << endl; return 0; } 1. 函数重载 重载的多个函数只是处理的数据的类型不一样,除此之外, 其它操作完全一样,但针对每种数据类型都必须实现一个函 数完成相应的操作
u1:57 2.链表类 class linKlist i 本链表类中只能保存整型 struct NODE I 数据,若要保存其它类型的 int 1 数据,必须另外创建一个 NODE next. 类,但类的结构、实现代码 )*head 几乎一样,只是其中的int public: 被相应的数据类型替换 LINKLIST O LINKLIST (LINKLIST&);问题: LINKLIST O 对不同的数据类型,代码 void Created 存在冗余,不利于代码重用 void Insert ( int 模板: 定义函数或创建类时,把数据的类型做为形式参数,调 用函数或定义对象时传以要处理数据的类型做为实际参数
21:17:57 解决办法: 把要操作的数据的类型 做为函数或类的参数 2. 链表类 class LINKLIST{ struct NODE { int i; NODE * next; }*head; public: LINKLIST(); LINKLIST(LINKLIST &); ~LINKLIST(); void Create(); void Insert(int i); void Remove(int i); NODE *Find(int i); }; 本链表类中只能保存整型 数据,若要保存其它类型的 数据,必须另外创建一个 类,但类的结构、实现代码 几乎一样,只是其中的int 被相应的数据类型替换 问题: 对不同的数据类型,代码 存在冗余,不利于代码重用 模板: 定义函数或创建类时,把数据的类型做为形式参数,调 用函数或定义对象时传以要处理数据的类型做为实际参数
u1:57 §2函数模板 定义语法:使用关键字 template template< typename类型形式参数表> 返回值类型函数名(函数的形式参数表) 函数体;} 例:函数模板 1.abs0函数 template <typename T>void maino t t Tabs t x) cout<<Tabs(10)<<end 1; cout<<Tabs(10. 5)<<end return x>0?x cout<<Tabs(1000000)<<end 1;
21:17:57 §2 函数模板 ➢定义语法: 使用关键字template template <typename 类型形式参数表> 返回值类型 函数名(函数的形式参数表) { 函数体;} 例:函数模板 1. abs()函数 template <typename T> T Tabs(T x) { return x>0?x:-x; } void main(){ cout<<Tabs(10)<<endl; cout<<Tabs(-10.5)<<endl; cout<<Tabs(-1000000)<<endl; }