一,泛型编程

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

二,函数重载和函数模板的关联

函数重载:定义函数名相同而形参列表(形参个数或形参类别)不同的多个函数。。
函数模板:创建一类实现逻辑(函数体)一样,只是用到参数的类型不同的函数的公式。
区别:
1,函数重载用于定义功能相似的同名函数,提高函数的易用性,但代码复用率低,只要有新类型出现就要增加对应的函数,而且代码可维护性低;函数模板则用于为实现逻辑一样只是参数类型不同的一类函数提供统一的模板,提高了函数编写的效率。
2,形参列表:函数重载要求参数个数或类型不同,而函数模板则要求参数个数必须一样。
联系:函数模板也能进行函数重载

三,函数模板

概念:该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
格式:
template<typename T1,typename T2,…typename Tn>
返回值类型 函数名( 参数列表{}
(template可用class代替)
模板只是一个蓝图(设计的稿纸),它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。

四,函数模板的实例化

1,隐式实例化:让编译器根据实参推演模板参数的实际类型(编译阶段)
2,显式实例化:在函数名后面<>中指定模板参数的实际类型

/函数模板的转化
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(a1, (int)d2);// 对函数模板进行隐式实例化// 同名函数与函数模板同时存在时,优先使用模板生成的同名函数Add<>(1, 2);Add<int>(a1, d2);system("pause");return 0;
}

由于在模板中,编译器不会进行类型转换操作,因此有两种处理方式:1,用户自己强制转化 2,使用显式实例化。
如果类型不匹配,编译器会尝试进行隐式转换,如果无法转换成功编译器将会报错。

五,函数模板匹配原则

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

六,类模板

格式:template <class T1, class T2…class Tn>
class 类模板名
{
}
实例化:类模板的实例化需要在类模板名字后面跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

//用类模板写一个动态类型顺序表#include<assert.h>template<class T>
class SeqList
{
public:SeqList(size_t capacity = 10):_array(new T[capacity]), _size(0), _capacity(capacity){}~SeqList(){delete[] _array;_array = nullptr;_capacity = 0;_size = 0;}void PopBack(){--_size;}size_t size() const{return _size;}size_t capacity() const{return _capacity;}bool Empty() const{return 0 == _size;}T& operator[](size_t index){assert(index < _size);return _array[index];}const T& operator[](size_t index)const{assert(index < _size);return _array[index];}void PushBack(const T& data);private:void _CheckCapacity(){if (_size == _capacity){// 开辟新空间T* array = new T[2 * _capacity];// 拷贝元素// memcpy(array, _array, _size*sizeof(T));for (size_t i = 0; i < _size; ++i){array[i] = _array[i];}// 释放旧空间delete[] _array;_array = array;_capacity *= 2;}}private:T* _array;size_t _size;size_t _capacity;
};template<class T>
void SeqList<T>::PushBack(const T&data)
{_CheckCapacity();_array[_size++] = data;
}
void TestSeqList()
{SeqList<int>  s1;s1.PushBack(1);s1.PushBack(2);s1.PushBack(3);s1.PushBack(4);cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1[2] << endl;s1[2] = 10;SeqList<double>  s2;s2.PushBack(1.0);s2.PushBack(2.0);s2.PushBack(3.0);s2.PushBack(4.0);s2.PushBack(5.0);cout << s2.size() << endl;cout << s2.capacity() << endl;
}int main()
{TestSeqList();system("pause");return 0;
}

C++ --函数模板初阶的知识总结相关推荐

  1. 学习笔记:C++初阶【C++入门、类和对象、C/C++内存管理、模板初阶、STL简介、string、vector、list、stack、queueu、模板进阶、C++的IO流】

    文章目录 前言 一.C++入门 1. C++关键字 2.命名空间 2.1 C语言缺点之一,没办法很好地解决命名冲突问题 2.2 C++提出了一个新语法--命名空间 2.2.1 命名空间概念 2.2.2 ...

  2. C/C++内存管理模板初阶

    内存管理和模板初阶 1 内存管理 1.1 C/C++ 的内存分布 1.2 C 中动态内存管理方式 1.3 C++ 中动态内存管理方式 1.3.1 new/delete操作内置类型 1.3.2 new/ ...

  3. c++之模板初阶详解!

    c++之模板初阶详解 文章目录 c++之模板初阶详解 泛型编程 函数模板 函数模板概念 函数模板格式 模板的原理 函数模板的实例化 模板实例化的个数 对于同不同类型的传参! 如何处理这个问题呢? 关于 ...

  4. C++之模板初阶:甩锅编译器

    目录 前言 1.泛型编程 2.函数模板 2.1函数模板概念 2.2 函数模板格式 2.3 利用模板来实现两个数的交换 2.3 函数模板原理 2.4 函数模板的实例化 2.4.1 隐式实例化 2.4.2 ...

  5. 【C++】模板初阶STL简介

    今天,你内卷了吗? 文章目录 一.泛型编程 二.函数模板(显示实例化和隐式实例化) 1.函数模板格式 2.单参数模板 3.多参数模板 4.模板参数的匹配原则 三.类模板(没有推演的时机,统一显示实例化 ...

  6. 《C++复习---模板初阶》

    本节主要有以下内容: 一. 泛型编程 二.函数模板 三.类模板 一. 泛型编程 1.概念:编写与类型无关的通用代码,是代码复用的一种手段.模板是泛型编程的基础. 二.函数模板 1.概念:函数模板代表了 ...

  7. 【python学习】函数篇-初阶

    什么是函数? 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段,它能够提高应用的模块性和代码的重复利用率. 1 函数的定义和调用 Python定义函数使用def关键字,格式如下: def ...

  8. C语言初阶_初识C语言(1)

    凡是过往,皆为序章 期末考试结束了,真是感慨良多啊...... C语言编程题大家都做对了多少呢? 不管怎么样,都已经过去了.不管你学得怎么样,都可以在接下来的时间里,我们一起重新回顾一遍C语言初阶的知 ...

  9. C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化

    C++模板 模板初阶 泛型编程 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化:在函数名后的<>中指定模板参数的实际类型 模板参数的匹配原则 ...

最新文章

  1. TensorFlowSharp入门使用C#编写TensorFlow人工智能应用
  2. 揭榜:2018中国AI英雄风云榜,年度10位杰出领军人物!
  3. 构造函数(包含this关键字的简单应用)
  4. 外包物料成本核算时的供应商确定
  5. DCMTK:在OFFile类中non-trivial fseek和ftell实现的测试程序
  6. html5+hbuilder+夜神模拟器+webview
  7. 使用Azure DevOps Pipeline实现.Net Core程序的CD
  8. java 持续集成工具_Jenkins-Jenkins(持续集成工具)下载 v2.249.2官方版--pc6下载站
  9. jquery微博实例
  10. java时间的整的表达式_Quartz中时间表达式的设置-----corn表达式
  11. 对于DOM的attribute和property的一些思考
  12. 初识Redis educoder
  13. 【MyBean调试笔记】接口的使用和清理
  14. mysql修改表分界符号_mysql---触发器
  15. iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果
  16. 如何下载股票的历史收盘价 股票历史收盘价下载方法
  17. python读取usb数据显示_在python中从各种usb设备读取和存储各种数据
  18. 如何在各种非三星电脑上安装Samsung Notes三星笔记
  19. 实际业务中的数据分析流程和痛点
  20. 水清冷冷:AutoCAD 2018安装图文教程方法(附工具),windows系统X64

热门文章

  1. 屏的像素与传输速率_8M的摄像头,30fps摄像时,60hz的LCD刷新频率,请问camera每秒向BB传输多少数据,如何计算...
  2. 高德谷歌腾讯天地图地图瓦片url
  3. 王者荣耀手游项目笔记
  4. 【软件使用】Grammarly 使用指南
  5. 扫雷--优化版实现(可以自动展开、标记雷、取消标记,并加入了标记出所有的雷直接获胜、自动清屏)
  6. Wifi控制帧:RTS/CTS和ACK
  7. spu是什么计算机软件,求高端电脑配置及价格,主要运行软件为ANSYS HFSS这两款!
  8. 23.Qt Quick QML-400行实现一个好看的图片浏览器-支持多个图片浏览、缩放、旋转、滑轮切换图片...
  9. dom-to-image/将网页dom节点转换成 svg/png/jpeg图片
  10. [转] 从零推导支持向量机 (SVM)