- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章 函数模板与类模板
一、函数模板
设计程序中的函数时,可能会遇到函数中参数的类型有差异,但需要实现的功能类似的情形。函数重载可以处理这种情形。重载函数的参数表中,可以写不同类型的参数,从而可以处理不同的情形。
函数模板的概念
为了提高效率,实现代码复用,C++提供了一种处理机制,即使用函数模板。函数在设计时并不使用实际的类型,而是使用虚拟的类型参数。这样可以不必为每种不同的类型都编写代码段。当用实际的类型来实例化这种函数时,将函数模板与某个具体数据类型连用。编译器将以函数模板为样板,生成一个函数,即产生了模板函数,这个过程称为函数模板实例化。函数模板实例化的过程由编译器完成。程序设计时并不给出相应数据的类型,编译时,由编译器根据实际的类型进行实例化。
#includeiostream
using namespace std;
templatetypename T? //注意这行跟下面的是一体的,中间不能有别的代码
T abs(T x) {
????return x0?-x:x;
}
int main( ) {
????int n=-5;
????int m=10;
????double d=-.5;
????float f=3.2;
????coutn的绝对值是:abs(n)endl;
????coutm的绝对值是:abs(m)endl;
????coutd的绝对值是:abs(d)endl;
????coutf的绝对值是:abs(f)endl;
????return 0;
}
-5的绝对值是:5
10的绝对值是:10
-0.5的绝对值是:0.5
3.2的绝对值是:3.2
函数模板的示例
在主函数中,调用abs(n)时,编译器根据实参n的类型int,推导出模板中的类型参数T为int,然后实例化函数模板,生成函数模板abs的一个实例。
int abs (int x) {
?? ?return x 0 ? -x : x;
}
这个实例即是模板函数。
当调用abs(d)时,根据实参d的类型double,又实例化一个新的函数。
double abs (double x){
?? ?return x 0 ? -x : x;
}
这是另一个模板函数。
实际上,函数模板不是一个具体的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。
虽然函数模板的使用形式与函数类似,但二者有本质的区别,主要表现在以下3个方面。
函数模板本身在编译时不会生成任何目标代码,只有当通过模板生成具体的函数实例时才会生成目标代码。
被多个源文件引用的函数模板,应当连同函数体一同放在头文件中,而不能像普通函数那样只将声明放在头文件中。
函数指针也只能指向模板的实例,而不能指向模板本身。
#includeiostream
using namespace std;
templateclass T
void Swap(T x,T y) {
????T tmp=x;
????x=y;
????y=tmp;
}
class myDate {
????public:
????myDate();
????myDate(int,int,int);
????void printDate()const;
????private:
????int year,month,day;
};
myDate::myDate() {
????year=1970;
????month=1;
????day=1;
}
myDate::myDate(int y,int m,int d) {
????year=y;
????month=m;
????day=d;
}
void myDate::printDate() const {
????coutyear/month/dayendl;
????return;
}
int main() {
????int n=1,m=2;
????Swap(n,m);? ? //编译器自动生成void Swap(int ,int )函数
????coutn mendl;
????double f=1.2,g=2.3;
????Swap(f,g);? ? //编译器自动生成void Swap(double ,double )函数
????coutf gendl;
????myDate d1,d2(2000,1,1);? ? //创建两个对象
????Swap(d1,d2);? ? //编译器自动生成void Swap(myDate ,myDate )函数
????d1.printDate();
????d2.printDate();
????return 0;
}
函数模板中还可以带多个类型参
您可能关注的文档
- 《C++程序设计》学习笔记总结 - 第八章 文件操作.docx
- 《C++程序设计》学习笔记总结 - 第二章 面向对象的基本概念.docx
- 《C++程序设计》学习笔记总结 - 第六章 多态与虛函数.docx
- 《C++程序设计》学习笔记总结 - 第七章 输入输出流.docx
- 《C++程序设计》学习笔记总结 - 第三章 类和对象进阶.docx
- 《C++程序设计》学习笔记总结 - 第四章 运算符重载.docx
- 《C++程序设计》学习笔记总结 - 第五章 类的继承与派生.docx
- 《C++程序设计》学习笔记总结 - 第一章 C++语言简介.docx
- 《计机算网络原理》学习笔记总结 - 第八章 网络安全基础.docx
- 《计机算网络原理》学习笔记总结 - 第二章 网络应用.docx
文档评论(0)