C++中函数模板的用法详细解析

定义

我们知道函数的重载可以实现一个函数名多用,将功能相同或者类似函数用同一个名来定义。这样可以简化函数的调用形式,但是程序中,仍然需要分别定义每一个函数。

C++提供的函数模板可以更加简化这个过程。

所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。

凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。

定义函数模板的一般形式为:


代码如下:

template <typename T>
通用函数定义

或者


代码如下:

template <class T>
通用函数定义

下面,我们来对比一下使用普通函数,使用函数的重载,以及使用函数的模板时的情况:

该段代码用于解决不用的类型数据相加的问题

使用多个普通函数
=============示例代码1.1==============


代码如下:

#include<iostream>
using namespace std;
int int_add(int a,int b)                              //定义函数int_add用于int型数据相加
{
 int c;
 c=a+b;
 return c;
}
double dou_add(double a,double b)     //定义函数dou_add用于double型函数相加
{
 double c;
 c=a+b;
 return c;
}
int main()
{
 cout<<int_add(5,3)<<endl;              //调用int_add函数
 cout<<dou_add(5.35,5.5)<<endl;  //调用dou_add函数
 return 0;
}

使用构造函数
===============示例代码1.2===============


代码如下:

#include<iostream>
using namespace std;
int n_add(int a,int b)                              //定义函数n_add用于int型数据相加
{
 int c;
 c=a+b;
 return c;
}
double n_add(double a,double b)    //定义函数n_add用于double型函数相加
{
 double c;
 c=a+b;
 return c;
}
int main()
{
 cout<<n_add(5,3)<<endl;             //调用n_add函数
 cout<<n_add(5.35,5.5)<<endl;   //调用n_add函数
 return 0;
}

使用函数模板
===============示例代码1.3===================


代码如下:

#include<iostream>
using namespace std;
template<typename T>
T n_add(T a,T b)
{
 T c;
 c=a+b;
 return c;
}
int main()
{
 cout<<n_add(5,3)<<endl;
 cout<<n_add(5.35,5.5)<<endl;
 return 0;
}

分析:首先分析示例代码1.1,该代码根据不同的的数据(int和double两种)相加,分别定义了两个不同的函数int_add和dou_add,当不同类型的数据相加时,我们人工的设定使用对应的函数进行操作。

示例代码1.2相比1.1而言,在函数的调用形式上进行了简化,使用了函数的重载技术,对于所有的数据,统一使用函数n_add进行操作,编译系统会根据数据的类型自动调用对应的函数。

示例代码1.3相比1.2而言,则有在函数体上进行了简化,如果我们使用了函数模板,我们就没有必要去一一书写对应的函数,我们只需要构造相应的模板,然后系统会自动判断数据的类型,然后替代对应的虚拟类型,

比如,当操作n_add(5.35,5.5)时,系统会自动判断数据为doubl型,然后就会将函数模板中的T替换成double:

也就相当于构造了函数:


代码如下:

int n_add(int a,int b)                            
{
 int c;
 c=a+b;
 return c;
}

(0)

相关推荐

  • c++中new和delete操作符用法

    "new"是C++的一个关键字,同时也是操作符.当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间.调用构造函数.返回正确的指针.当然,如果我们创建的是简单类型的变量,第二步就会被省略. new用法: 1. 开辟单变量地址空间 1)new int; 开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new int(5) 作用同上,但是同时将整数

  • C++中点操作符和箭头操作符的使用详解

    区别 C++中对于类来说,对于其中的成员,用点操作符.来获得, 而对于一个指向类对象的指针来说,则用箭头操作符->调用该指针所指向对象的成员. 当类定义->重载操作符后,则既可以用箭头操作符,也可以用点操作符. 重载->操作符 重载箭头操作符必须定义为类成员函数.没有显式形参(而且是类成员,唯一隐式形参是this).->的右操作数不是表达式,而是对应类成员的一个标识符,由编译器处理获取成员工作. 重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象.

  • C++中的三大函数和操作符重载(Boolan)

    C++中三大函数: 析构函数 复制构造函数 =操作符(copy assignment operator) 这三个特殊的成员函数如果程序员没有实现,编译器将提供默认的实现方式. 析构函数: 形如-foo_t(),函数名和构造函数相同,前面加-,如果对象是自由变量创建,析构函数将在脱离作用域时调用.如果对象是通过new操作符创建的,则通过delete操作符调用析构函数. 复制构造函数: 形如foo_t(const foo_t& foo),以下情况复制构造函数均会被调用: 当对象按值返回时候(retu

  • 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结

    1 . 用同一个类的源对象构造一个目标对象时,会调用拷贝构造函数来构造目标对象,如果没有定义拷贝构造函数,将调用类的默认拷贝函数来构造目标对象.2 . 当一个函数的返回值为一个类的对象时,如果在调用函数中,没有定义一个对象来接收这个返回对象值,会用返回一个临时对象保存返回对象的值.在被调用函数结束时,这个临时对象被销毁.而当调用函数中有一个接受对象时,就将返回对象赋值给接收对象,这个返回对象在调用函数结束时调用析构函数.3. 当类有一个带有一个参数的构造函数时,可以用这个参数同类型的数据初始化这

  • C++函数中return语句的使用方法

    C++中的return语句是函数中一个重要的语句,return语句用于结束当前正在执行的函数,并将控制权返回给调用此函数的函数. return语句有两种形式: return; return expression; 1.没有返回值的函数 不带返回值的return语句只能用于返回类型为void的函数,return语句是为了引起函数的强制结束,这种用法类似于循环结构中的break语句的作用. 例子: 复制代码 代码如下: void swap(int &v1,int &v2) { if(v1==v

  • C++中的操作符重载详细解析

    一.什么是操作符重载操作符重载可以分为两部分:"操作符"和"重载".说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符.我们不妨先直观的看一下所谓的操作符重载: 复制代码 代码如下: #include <iostream> using namespace std; int main(){    int a = 2 , b = 3;    float c =

  • C++中复制构造函数和重载赋值操作符总结

    前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符的实现要点: 4.复制构造函数的一些细节. 复制构造函数和重载赋值操作符的定义 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类: 复制代码 代码如下: class CTes

  • c++中的string常用函数用法总结

    标准c++中string类函数介绍 注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要.我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?).我们尽可以把它看成是C++的基本数据类型. 好了,进入正题---首先,为了在我们的程序中使用string类型,我们必须包含头文件 <string>

  • C++中的friend友元函数详细解析

    友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend. 我们已知道类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性.另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运

  • 浅谈C++函数声明后面加throw()的作用(必看)

    问题描述: C++里面为什么有时候在函数声明的时候在后面加throw()关键字? 解释: C++函数后面加关键字throw(something)限制,是对这个函数的异常安全作出限制:这是一种异常规范,只会出现在声明函数时,表示这个函数可能抛出任何类型的异常. void fun() throw();      //表示fun函数不允许抛出任何异常,即fun函数是异常安全的. void fun() throw(...);    //表示fun函数可以抛出任何形式的异常. void fun() thr

随机推荐