C++函数模板(模板函数)详解 您所在的位置:网站首页 c语言的模板函数有哪些 C++函数模板(模板函数)详解

C++函数模板(模板函数)详解

2023-06-01 12:20| 来源: 网络整理| 查看: 265

C++函数模板(模板函数)详解 定义用法:函数模板的原理延申用法2.1为什么需要类模板2.2单个类模板语法2.3继承中的类模板语法案例1:案例2: 2.4类模板的基础语法2.5类模板语法知识体系梳理1.所有的类模板函数写在类的内部复数类: 2.所有的类模板函数写在类的外部,在一个cpp中 2.5总结关于类模板的几点说明: 2.6类模板中的static关键字案例2:以下来自:C++类模板遇上static关键字 2.7类模板在项目开发中的应用训练题1) 请设计一个数组模板类( MyVector ),完成对int、char、Teacher类型元素的管理。2) 请仔细思考:3) 请从数组模板中进行派生 作业:zuoye.hzuoye_test12.cppzuoye12.cpp

定义

函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。(好吧,咱也听不懂,直接上用法吧?)

用法:

面向对象的继承和多态机制有效提高了程序的可重用性和可扩充性。在程序的可重用性方面,程序员还希望得到更多支持。举一个最简单的例子,为了交换两个整型变量的值,需要写下面的 Swap 函数:

void Swap(int & x, int & y) { int tmp = x; x = y; y = tmp; }

为了交换两个 double 型变量的值,还需要编写下面的 Swap 函数:

void Swap (double & xr double & y) { double tmp = x; x = y; y = tmp; }

如果还要交换两个 char 型变量的值,交换两个 CStudent 类对象的值……都需要再编写 Swap 函数。而这些 Swap 函数除了处理的数据类型不同外,形式上都是一样的。能否只写一遍 Swap 函数,就能用来交换各种类型的变量的值呢?继承和多态显然无法解决这个问题。因此,“模板”的概念就应运而生了。

众所周知,有了“模子”后,用“模子”来批量制造陶瓷、塑料、金属制品等就变得容易了。程序设计语言中的模板就是用来批量生成功能和形式都几乎相同的代码的。有了模板,编译器就能在需要的时候,根据模板自动生成程序的代码。从同一个模板自动生成的代码,形式几乎是一样的。

函数模板的原理

C++ 语言支持模板。有了模板,可以只写一个 Swap 模板,编译器会根据 Swap 模板自动生成多个 Sawp 函数,用以交换不同类型变量的值。

在 C++ 中,模板分为函数模板和类模板两种。

函数模板是用于生成函数;类模板则是用于生成类的。

函数模板的写法如下:

template 返回值类型 模板名(形参表) { 函数体 }

其中的 class 关键字也可以用 typename 关键字替换,例如:

template

函数模板看上去就像一个函数。前面提到的 Swap 模板的写法如下:

template void Swap(T & x, T & y) { T tmp = x; x = y; y = tmp; }

T 是类型参数,代表类型。编译器由模板自动生成函数时,会用具体的类型名对模板中所有的类型参数进行替换,其他部分则原封不动地保留。同一个类型参数只能替换为同一种类型。编译器在编译到调用函数模板的语句时,会根据实参的类型判断该如何替换模板中的类型参数。

例如下面的程序:

#include using namespace std; template void Swap(T & x, T & y) { T tmp = x; x = y; y = tmp; } int main() { int n = 1, m = 2; Swap(n, m); //编译器自动生成 void Swap (int &, int &)函数 double f = 1.2, g = 2.3; Swap(f, g); //编译器自动生成 void Swap (double &, double &)函数 return 0; }

编译器在编译到Swap(n, m);时找不到函数 Swap 的定义,但是发现实参 n、m 都是 int 类型的,用 int 类型替换 Swap 模板中的 T 能得到下面的函数:

void Swap (int & x, int & y) { int tmp = x; x = y; y = tmp; }

该函数可以匹配Swap(n, m);这条语句。于是编译器就自动用 int 替换 Swap 模板中的 T,生成上面的 Swap 函数,将该 Swap 函数的源代码加入程序中一起编译,并且将Swap(n, m);编译成对自动生成的 Swap 函数的调用。

同理,编译器在编译到Swap(f, g);时会用 double 替换 Swap 模板中的 T,自动生成以下 Swap 函数:

void Swap(double & x, double & y) { double tmp = x; x = y; y = tmp; }

然后再将Swap(f, g);编译成对该 Swap 函数的调用。

编译器由模板自动生成函数的过程叫模板的实例化。由模板实例化而得到的函数称为模板函数。在某些编译器中,模板只有在被实例化时,编译器才会检查其语法正确性。如果程序中写了一个模板却没有用到,那么编译器不会报告这个模板中的语法错误。

编译器对模板进行实例化时,并非只能通过模板调用语句的实参来实例化模板中的类型参数,模板调用语句可以明确指明要把类型参数实例化为哪种类型。可以用:

模板名

的方式告诉编译器应该如何实例化模板函数。例如下面的程序:

#include using namespace std; template T Inc(int n) { return 1 + n; } int main() { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有