• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 简单掌握C++中的函数模板

简单掌握C++中的函数模板

作者:BeyondHaven 字体:[增加 减小] 来源:互联网 时间:2017-05-28

BeyondHaven 通过本文主要向大家介绍了c++函数模板,c++函数模板实例化,c++虚函数,c++构造函数,c++字符串函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1.函数模板的声明和模板函数的生成
1.1函数模板的声明
函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。
函数模板的声明形式为:
template<typename 数据类型参数标识符>

<返回类型><函数名>(参数表)
{
  函数体
}
</div>

其中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。例如:

template<typename T>
T fuc(T x, int y)
{
  T x;
  //……
}
</div>

如果主调函数中有以下语句:

double d;
int a;
fuc(d,a);
</div>

则系统将用实参d的数据类型double去代替函数模板中的T生成函数:

double fuc(double x,int y)
{
  double x;
  //……
}
</div>

函数模板只是声明了一个函数的描述即模板,不是一个可以直接执行的函数,只有根据实际情况用实参的数据类型代替类型参数标识符之后,才能产生真正的函数。
关键字typename也可以使用关键字class,这时数据类型参数标识符就可以使用所有的C++数据类型。
1.2.模板函数的生成
函数模板的数据类型参数标识符实际上是一个类型形参,在使用函数模板时,要将这个形参实例化为确定的数据类型。将类型形参实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数。模板函数的生成就是将函数模板的类型形参实例化的过程。例如:
使用中应注意的几个问题:
(1)函数模板允许使用多个类型参数,但在template定义部分的每个形参前必须有关键字typename或class,即:
template<class 数据类型参数标识符1,…,class 数据类型参数标识符n>

<返回类型><函数名>(参数表)
{
   函数体
}

</div> </div> </div>
template<class T>
int I;
T min(T x,T y)
{
  函数体
}
</div>

(3)模板函数类似于重载函数,但两者有很大区别:函数重载时,每个函数体内可以执行不同的动作,但同一个函数模板实例化后的模板函数都必须执行相同的动作。

2 函数模板的异常处理
函数模板中的模板形参可实例化为各种类型,但当实例化模板形参的各模板实参之间不完全一致时,就可能发生错误,如:

template<typename T>    
void min(T &x, T &y)
{ return (x<y)?x:y; }
void func(int i, char j)
{
  min(i, i);
  min(j, j);
  min(i, j);
  min(j, i);
}
</div>

例子中的后两个调用是错误的,出现错误的原因是,在调用时,编译器按最先遇到的实参的类型隐含地生成一个模板函数,并用它对所有模板函数进行一致性检查,例如对语句

min(i, j);
</div>

先遇到的实参i是整型的,编译器就将模板形参解释为整型,此后出现的模板实参j不能解释为整型而产生错误,此时没有隐含的类型转换功能。解决此种异常的方法有两种:
(1)采用强制类型转换,如将语句min(i, j);改写为min(i,int( j));
(2)用非模板函数重载函数模板
方法有两种:
(1)借用函数模板的函数体
此时只声明非模板函数的原型,它的函数体借用函数模板的函数体。如改写上面的例子如下:
template<typename T>      

void min(T &x, T &y)
{ return (x<y)?x:y; }
int min(int,int);
void func(int i, char j)
{
  min(i, i);
  min(j, j);
  min(i, j);
  min(j, i);
}
</div>

执行该程序就不会出错了,因为重载函数支持数据间的隐式类型转换。
(2)重新定义函数体
就像一般的重载函数一样,重新定义一个完整的非模板函数,它所带的参数可以随意。C++中,函数模板与同名的非模板函数重载时,应遵循下列调用原则:
• 寻找一个参数完全匹配的函数,若找到就调用它。若参数完全匹配的函数多于一个,则这个调用是一个错误的调用。
• 寻找一个函数模板,若找到就将其实例化生成一个匹配的模板函数并调用它。
• 若上面两条都失败,则使用函数重载的方法,通过类型转换产生参数匹配,若找到就调用它。
•若上面三条都失败,还没有找都匹配的函数,则这个调用是一个错误的调用。

3.小例子

#include <iostream> 
#include <string> 
using namespace std; 
 
template<class T> void swap(T *x, T *y){//函数的模板,只要能使用等号赋值类型都可以用这个模板互换 
  T temp = *x; 
  *x = *y; 
  *y = temp; 
} 
 
void main(){ 
  int i = 9, j = 5; 
  float k = 9.2, l = 5.6; 
  swap(&i, &j);//交换整形 
  swap(&k, &l);//交换浮点型 
  cout<<"i = "<<i<<" , j = "<<j<<endl; 
  cout<<"k = "<<k<<" , l = "<<l<<endl; 
} 
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 简单掌握C++中的函数模板
  • 实例讲解在C++的函数中变量参数及默认参数的使用
  • 深入解析C++中的函数模板和函数的默认参数
  • 如何在C++中通过模板去除强制转换
  • C++模板类的用法实例
  • C++虚函数表实例分析
  • C++函数模板与类模板实例解析
  • C++中函数模板的用法详细解析
  • 浅析C++中模板的那点事

相关文章

  • 2017-05-28C++中关于[]静态数组和new分配的动态数组的区别分析
  • 2022-04-30C语言编译和链接详解(通俗易懂,深入本质)
  • 2017-05-28C++与C#互调dll的实现步骤
  • 2017-05-28浅谈C++的语句语法与强制数据类型转换
  • 2017-05-28C语言实现颠倒栈的方法
  • 2017-05-28C++实现对输入数字组进行排序
  • 2017-05-28基于c语言知识点的补遗介绍
  • 2017-05-28c++ String去除头尾空格的方法
  • 2017-05-28c++面试题字符串拷贝函数示例
  • 2017-05-28c语言随机数函数示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 通过一个小例子来简单理解C语言中的内存空间管理
    • C++临时性对象的生命周期详细解析
    • 利用C++实现从std::string类型到bool型的转换
    • C++的get()函数与getline()函数使用详解
    • C语言双向链表实现根据使用频率安排元素位置的功能实例代码
    • C语言获得电脑的IP地址的小例子
    • 详解C++编程中的重载流插入运算符和流提取运算符
    • VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出解决方法
    • 深入解析C++编程中的运算符重载
    • C++遍历文件夹获取文件列表

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有