为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数,如下所示:

//交换 int 变量的值
void Swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}//交换 float 变量的值
void Swap(float *a, float *b){
float temp = *a;
*a = *b;
*b = temp;
}//交换 char 变量的值
void Swap(char *a, char *b){
char temp = *a;
*a = *b;
*b = temp;
}//交换 bool 变量的值
void Swap(bool *a, bool *b){
char temp = *a;
*a = *b;
*b = temp;
}

这些函数虽然在调用时方便了一些,但从本质上说还是定义了三个功能相同、函数体相同的函数,只是数据的类型不同而已,这看起来有点浪费代码,能不能把它们压缩成一个函数呢?

能!可以借助本节讲的函数模板。

我们知道,数据的值可以通过函数参数传递,在函数定义时数据的值是未知的,只有等到函数调用时接收了实参才能确定其值。这就是值的参数化。

在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。

值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。

所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。

在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持值的参数化,还支持类型的参数化。

一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。

下面我们就来实践一下,将上面的四个Swap() 函数压缩为一个函数模板:

/*************************************************************************> File Name: swap.cpp> Author: Nightsong> Mail: 16232321307@qq.com > Created Time: 2017-01-20 10:10:34************************************************************************/#include<iostream>
#include <string>
template <class T>
void swap(T &a, T &b)
{T tmp = a;a = b;b = tmp;
}
int main ()
{int i1 = 100;int i2 = 200;std::cout<< "i1 = "<< i1 <<"i2 = " << i2<<"\n";swap(i1, i2);std::cout<< "i1 = "<< i1 <<"i2 = " << i2<<"\n";std::string a="night";std::string b="song";std::cout<< a << b <<"\n";swap(a, b);std::cout<< a << b <<"\n";
}

在下是个linux小菜,希望边学习c语言能一边学习vim和linux这样学起来稍微慢一些,不过效果很棒棒噢!

欢迎来到我的IT 博客http://www.nightsong.cc

QQ:1623231307

C++ 函数模板 懒人必备!相关推荐

  1. css自动转rem,css之px自动转rem—“懒人”必备

    作为一名前端开发,尤其是在做移动端适配时,rem是我们经常用到的单位,它的好处大家可以自行搜索,网上已经有很多了. 但是我们再将设计稿上的px转换成rem时,得手动的去计算,这是一个很耗时.费力的过程 ...

  2. 懒人必备,4款匠心打造的国产软件,每一款都堪称珍品

    话不多说,咱们直入主题. Wox Wox,是一款懒人必备的搜索效率工具. Wox 软件界面简洁,体积轻巧,只需一个搜索框,放置在桌面,你便可以,一键搜索电脑上的任意文件.网页.以及软件等等,减少很多不 ...

  3. irobot擦地机器人故障_懒人必备神器,电动高频擦地,科沃斯地宝T8 AIVI扫地机器人...

    虽说一屋不扫,何以扫天下,但扫地真的累,本来一天回到家就很累了,扫地拖地就需要半个小时,有时候床底桌底还清理不到,周末还要时不时的来一次全方位的大扫除,本来就难得的休息时间就浪费在了扫地拖地上了.好在 ...

  4. 懒人必备 自动识别语音给视频添加字幕

    在这样一个每个人都可以制作视频的时代. 日常Vlog主,视频博主们在剪辑视频中碰到最苦逼的事莫过于给视频加字幕. 对此很是"深恶痛绝",拍摄30分钟,加字幕两小时,简单枯燥耗时耗力 ...

  5. 懒人必备,自动识别语音给视频添加字幕

    在这样一个每个人都可以制作视频的时代. 日常Vlog主,视频博主们在剪辑视频中碰到最苦逼的事莫过于给视频加字幕. 对此很是"深恶痛绝",拍摄30分钟,加字幕两小时,简单枯燥耗时耗力 ...

  6. 懒人必备公式快速插入word(latexocr+TyporaMathtype)保姆集教程

    懒人必备公式快速插入word(latexocr+Typora/Mathtype)保姆集教程 演示 (有编程基础的,直接看Latexocr怎么获取就可以,其他你肯定搞得定) 1.点击Snip(或者快捷键 ...

  7. 懒人必备!只需一行代码,就能导入所有的Python库

    今天给大家介绍一个懒人Python库--Pyforest. 使用一行代码,就能导入所有的Python库(本地已经安装的). GitHub地址:https://github.com/8080labs/p ...

  8. 懒人必备:最强多人智能记账APP 百事AA记账

    春节马上到了,灵魂之问即将再袭:今年能赚多少钱 ?存下多少钱?改个歌词来回应:钱都去哪里了,还没好好享受,就没了-- 这反映多数人的账是不清楚,没有管理的. 真正的牛人,都重视财务管理.美国历史上第一 ...

  9. 一款懒人必备的Python爬虫神器

    前言 今天把最近的一个应用做好了,测试了一下运行没有问题,剩下的就是检验一下结果如何.从光谱到Lab值通常使用matlab中的roo2lab(),不过经过我最近的测试发现转换的结果并不理想,而且这个转 ...

最新文章

  1. LeetCode实战:旋转链表
  2. 企业移动应用平台:走进SAP SUP的世界
  3. 小心陷入MySQL索引的坑
  4. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)...
  5. 【JavaScript】用Switch实现成绩等级判断
  6. 大数据之-Hadoop环境搭建_安装hadoop---大数据之hadoop工作笔记0018
  7. How do you create a DynamicResourceBinding that supports Converters, StringFormat?
  8. 类似于QQ游戏百万人同时在线的服务器架构实现
  9. 使用ggplot2画图
  10. XTU 1205 Range
  11. 炉石传说android手机版本,炉石传说安卓手机版官方apk
  12. 用Python求解拿鸡蛋问题
  13. Mind思维导图-在线
  14. 服务器修改不了分辨率,ubuntu不能设置高分辨率问题的解决方法
  15. 不会写SQL?ChatGPT 来帮你
  16. 企业如何从0到1落地BI项目
  17. 微信小程序 之 程序题
  18. 《码出高效》五 异常与日志
  19. RTX3070+windows11cuda配置教程
  20. 数据库SQL server mangement studio服务器名称是什么

热门文章

  1. 代码随想录_二叉树_leetcode 701 450
  2. 导向纠偏器PG-250D50W230AR、PG-400D60W320AL
  3. html画圆圈原理,Html - 圆圈border
  4. webPack之安装配置教程
  5. Java——关于Excle表格的操作
  6. 论文阅读“Robust multi-view clustering with incomplete information”
  7. 一个单片机学徒过渡到嵌入式工程师的心路历程,教你精准避开内卷
  8. FlashFXP的使用
  9. nRF51822:在 macOS 下使用 SEGGER Embedded Studio(SES)搭建开发环境
  10. 电力系统GPS校时设备简介