广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 函数模板和类模板详情
  • 330
分享到

C++ 函数模板和类模板详情

2024-04-02 19:04:59 330人浏览 安东尼
摘要

目录1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式化 2.3 函数模板原理 2.4 函数模板实例化 2.5 模板参数的匹配原理 3. 类模板 3.1 类模

1. 泛型编程

如何实现一个通用的交换函数?
c++中可以用到函数重载


class A
{
public:
 void Swap(int& x1,int& x2)
 {
  int temp=x1;
  x1=x2;
  x2=temp;
 }

 void Swap(double& x1,double& x2)
 {
  double temp=x1;
  x1=x2;
  x2=temp;
 }
 
 void Swap(char& x1,char& x2)
 {
  char temp=x1;
  x1=x2;
  x2=temp;
 }
 
 //..............
};

但是这样写有几个缺点:

  • 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数
  • 代码的可维护性比较低,一个出错可能所有的重载均出错

那么能否告诉编译器一个摸子,让编译器根据不同类型利用该摸子来生成代码呢?

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段,模板是泛型的基础。

2. 函数模板

2.1 函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2.2 函数模板格式化


template<typename T1,typename T2,......,typename Tn>


返回类型 函数名(参数列表){}


template<typename T>
void Swap( T& left, T& right)
{
    T temp = left;
    left = right;
    right = temp;
}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

2.3 函数模板原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

2.4 函数模板实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。

  • 隐式实例化:让编译器根据实参推演模板参数的实际类型

template<class T>
T Add(const T& left, const T& right)
{
    return left + right;
}
int main()
{
    int a1 = 10, a2 = 20;
    double d1 = 10.0, d2 = 20.0;
    Add(a1, a2);
    Add(d1, d2);
    Add(a,(int)b);
    return 0;
}

  • 显示实例化:在函数名后<>中指定模板参数的实际类型

int main(void)
{
    int a = 10;
    double b = 20.0;
 
    // 显式实例化
    Add<int>(a, b);
    return 0;
}

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

2.5 模板参数的匹配原理

  • 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
  • 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
  • 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

3. 类模板

学习C语言中,我们写一个顺序表的时候会先用

typedef int ST ;

但是在实际用的时候无法又用int又用double又用char,所以在C++中就有了类模板。

3.1 类模板的定义格式

类模板的格式:


template<class T1, class T2, ..., class Tn>
class 类模板名
{
 // 类内成员定义
}; 

跟函数模板没有什么区别

在写顺序表的时候:


template<class T>
class Vector
{ 
public :
    Vector(size_t capacity = 10)
    : _pData(new T[capacity])
    , _size(0)
    , _capacity(capacity)
   {}
   
   // 使用析构函数演示:在类中声明,在类外定义。
   ~Vector();
   
private:
   T* _pData;
   size_t _size;
   size_t _capacity;
};

// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
    if(_pData)
    delete[] _pData;
    _size = _capacity = 0;
}

3.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。


// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

到此这篇关于C++ 函数模板和类模板详情的文章就介绍到这了,更多相关C++ 函数模板和类模板内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 函数模板和类模板详情

本文链接: https://www.lsjlt.com/news/135140.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 函数模板和类模板详情
    目录1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式化 2.3 函数模板原理 2.4 函数模板实例化 2.5 模板参数的匹配原理 3. 类模板 3.1 类模...
    99+
    2022-11-12
  • C++函数模板和类模板分析
    本篇内容介绍了“C++函数模板和类模板分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.函数模板函数模板定义了参数化的非成员函数,这使得...
    99+
    2023-06-17
  • 浅析C++函数模板和类模板
    目录一、函数模板1、函数模板的定义和使用2、函数模板的编译原理3、函数模板的声明二、类模板1、类模板的定义和使用2、类模板的编译原理3、类模板的继承和派生C++语言全盘继承了C语言的...
    99+
    2022-11-13
  • C++模板基础之函数模板与类模板实例详解
    目录泛型编程 函数模板 函数模板的概念 函数模板的格式 函数模板的原理 函数模板的实例化 函数模板的匹配原则 类模板 类模板的定义格式 类模板的实例化 总结泛型编程  ...
    99+
    2022-11-12
  • C++类模板与函数模板基础详细讲解
    目录函数模板类模板总结函数模板 当我们想要定义一个可以支持泛型的函数时,就要采用函数模板的方式了。所谓泛型就是可以支持多种类型的操作,比如我们定义一个compare操作,他可以根据传...
    99+
    2022-11-13
    C++类模板 C++函数模板
  • C++泛型编程函(数模板+类模板)
    目录一、函数模板1.函数模板介绍2.函数模板与重载函数的关系3.函数模板实现机制二、类模板1.类模板基本语法2.类模板内函数的整体布局【分文件使用类模板】3.类模板的static与模...
    99+
    2022-11-13
  • C++ 类模板与成员函数模板示例解析
    目录类模板类模板与成员函数模板的区别类模板 前面以函数模板为例,介绍了具体化与实例化。那么对于类模板,有什么不同呢? 类包括成员变量和成员函数,他们都可以包含类模板的模板参数。而成...
    99+
    2023-01-03
    C++ 类模板成员函数模板 C++ 类模板成员函数模板
  • 【C++】详细介绍模版初阶—函数模版、类模板
    文章目录 一、泛型编程二、函数模版2.1 函数模版概念2.2 函数模版格式2.3 函数模版的原理2.4 函数模版的实例化2.5 函数模版的匹配原则 三、类模版3.1 类模版定义3.2 类模...
    99+
    2023-09-02
    c++ 前端
  • C++函数模板的使用详解
    函数模板可以适用泛型来定义函数,其中泛型可以是(int, double, float)等替换。在函数重载过程中,通过将类型作为参数传递给模板,可使编译器自动产生该类型的函数。 工作原...
    99+
    2022-11-12
  • C++ 标准模板类详解
    目录1标准模板库2.泛型编程总结1 标准模板库 STL提供了表示容器、迭代器、函数对象和算法的模板。 容器:类似数组存储若干值,切实同质的; 迭代器:遍历容器的对象...
    99+
    2022-11-12
  • C++STL之vector模板类详解
    目录前言vector模板类创建vector对象,遍历元素迭代器容器的基本方法STL函数,sort总结前言 STL标准模板库是C++中非常有用的功能库。本篇从vector容器开始学习S...
    99+
    2022-11-13
  • c++类函数作为模板参数实现方式详解
    目录需求背景实现方式struct + operatorPass Function Signature需求背景 DB操作有四种基本操作:Insert、Update、Delete和Que...
    99+
    2023-03-01
    c++ 类函数作为模板参数 c++ 类函数
  • 【C++奇遇记】函数模板
    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏...
    99+
    2023-09-02
    c++ 开发语言
  • C++11模板函数的默认模板参数举例分析
    这篇文章主要介绍“C++11模板函数的默认模板参数举例分析”,在日常操作中,相信很多人在C++11模板函数的默认模板参数举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11模板函数的默认模板参数举...
    99+
    2023-06-19
  • C++函数模板怎么应用
    本篇内容介绍了“C++函数模板怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C++函数模板学习指南C++函数模板是一种高效的代码复用...
    99+
    2023-07-06
  • C++函数模板如何使用
    本篇内容介绍了“C++函数模板如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C++函数模板template<typename&...
    99+
    2023-07-05
  • C++学习之函数模板的使用详解
    目录C++函数模板重载的模板模板局限性显示具体化实例化和具体化模板函数类型的确定C++函数模板 template<typename T> void Swap(T &...
    99+
    2023-03-02
    C++函数模板使用 C++函数模板 C++函数
  • SpringBoot中使用Thymeleaf模板详情
    目录一.什么是Thymeleaf二.SpringBoot中使用Thymeleaf模板1.pom.xml中添加thymeleaf依赖2.关闭thymeleaf缓存3.创建thymele...
    99+
    2022-11-13
  • 详解C++中函数模板的定义与使用
    目录1. 前言2. 初识函数模板2.1 语法2.2 实例化2.3 实参推导3. 重载函数模板1. 前言 什么是函数模板? 理解什么是函数模板,须先搞清楚为什么需要函数模板。 如果现在...
    99+
    2022-11-13
  • C++使用宏函数实现单例模板详解
    目录ISingleton.hpp使用方式Aclass.hAclass.cppmain.c在我们日常开发中,无可避免需要使用单例模式进行设计类对象,那么实际上我们写单例格式基本都是一样...
    99+
    2023-02-10
    C++宏函数实现单例模板 C++ 单例模板 C++宏函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作