C++ 函数重载、函数模板,类模板
1.函数重载
相同作用域下,有多个函数名相同,但形参列表不同的函数,常用于处理功能相同但数据类型不同的问题
函数重载的规则:
函数名必须相同
函数形参列表必须不同(可以是参数个数不同,或者数据类型不同,或者参数排列顺序不同)
返回值可以相同也可以不同
注意:如果函数名相同,函数形参列表也相同,只有返回值不同,属于函数重定义
int GetMax(int a, int b)
{
return a>b ? a:b;
}
//函数名相同,形参数据类型和返回值不同
float GetMax(float a, float b)
{
return a>b ? a:b;
}
//函数名相同,形参数据类型和返回值不同
char GetMax(char a, char b)
{
return a>b ? a:b;
}
//函数名和返回值相同,形参数据类型相同,但个数不同
int GetMax(char a, char b, char c)
{
int nMax = a>b ? a:b;
return nMax>c ? nMax:c;
}
//Error:函数重定义,和int GetMax(int a, int b)相比只有返回值不同
/*
bool GetMax(int a, int b)
{
return a>b ? true:false;
}
*/
int _tmain(int argc, _TCHAR* argv[])
{
int nMax = GetMax(, ); //int GetMax(int a, int b) nMax = 2
float fMax = GetMax(1.2f, 1.36f); //float GetMax(float a, float b) fMax = 1.36f
char cMax = GetMax('z', 'a');//char GetMax(char a, char b) cMax ='z'
int nMaxThree = GetMax(, , );//int GetMax(char a, char b, char c) nMaxThree = 7 return ;
}
2.函数模板
建立一个通用函数,其函数类型和形参类型用一个虚拟的类型来代表,在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,这个通用函数就称为函数模板。
和上面的函数重载相比好处在于不必为每个不同的数据类型编写单独的函数,只需在模板中定义一次即可。
template<typename 类型参数1 , typename 类型参数2 , …>
前缀以关键字 template 开始,接下来是一组尖括号,里面包含一个或多个在模板中使用的通用数据类型, 多个通用类型之间加上逗号分隔
//函数模板
template<typename T>
T GetMax(T a, T b)
{
return a>b ? a:b;
} int _tmain(int argc, _TCHAR* argv[])
{
int nMax = GetMax(,); //nmax = 6
float fMax = GetMax(1.25f,1.2f); //fmax = 1.25
char cMax = GetMax('a','g'); //cMax = 'g' return ;
}
3.类模板
和函数模板相似,也是为了数据类型参数化,不同在于类模板在实例化时必须显式地指明数据类型,编译器不能根据给定的数据推演出数据类型。
如果在类外定义成员函数,必须重新再声明一次类模板
template<class 类型参数1 , class 类型参数2 , …>
前缀以关键字 template 开始,接下来是一组尖括号,里面包含一个或多个在模板中使用的通用数据类型, 多个通用类型之间加上逗号分隔
//类模板
template<class TT>
class CMax
{
public:
CMax(){}
CMax(TT a, TT b) : m_a(a), m_b(b){}
TT GetMax()
{
return m_a>m_b ? m_a:m_b;
}
void SetValue(TT a, TT b);
private:
TT m_a;
TT m_b;
};
//注意:类外定义成员函数还需要声明一次类模板
template<class TT>
void CMax<TT>::SetValue(TT a, TT b)
{
m_a = a;
m_b = b;
} int _tmain(int argc, _TCHAR* argv[])
{
CMax<int> maxA(,);
int nMaxA = maxA.GetMax(); //nMaxA = 6
CMax<float> maxB(1.25f,1.2f);
float fMaxB = maxB.GetMax(); //fMaxB = 1.25
CMax<char> maxC('a','g');
char cMaxB = maxC.GetMax(); //cMaxB = 'g'
CMax<int> maxD;
maxD.SetValue(,);
int nMaxdD = maxD.GetMax(); //nMaxD = 10
return ;
}
C++ 函数重载、函数模板,类模板的更多相关文章
- C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...
- C++ 类的多态二(函数重载--函数重写--函数重定义)
//函数重载--函数重写--函数重定义 #include<iostream> using namespace std; /* 函数重载: 必须在一个类中进行(子类无法重载父类中的函数) 子 ...
- C++函数模板&类模板
函数模板 模板概念及语法 主要目的,简化代码,减少重复代码.基本语法格式: template<class T> 或者 template<typename T> //末尾不加分 ...
- C++ 类中指向函数的指针 以及 类模板
C++类中总是出现诸如下面的情况 这是一篇深入浅出讲解函数指针的文章,值得参考! http://blog.csdn.net/lishuhuakai/article/details/18276477 关 ...
- C++ 函数模板&类模板详解
在 C++ 中,模板分为函数模板和类模板两种.函数模板是用于生成函数的,类模板则是用于生成类的. 函数模板&模板函数 类模板&模板类 必须区分概念 函数模板是模板,模板函数时 ...
- C++ 函数模板/类模板
#include <iostream> #include <vector> using namespace std; template < class T > // ...
- c++之函数重载(函数匹配)
Case void f(); void f(int); void f(int, int); void f(double, double = 3.14); 匹配原则: 1)其形参数量与本次调用提供的实参 ...
- 函数模板&类模板
#include <iostream> #if 0//函数模板 template<typename T> T max(T a, T b, T c)//函数模板 { if (a ...
- C++函数重载和函数模板(04)
函数重载 函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性. C++的多态性又被直观地称为“一个名字,多个函数”.源代码只指明函数调用,而不说明具体调用哪个函数.编译器的这 ...
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
随机推荐
- ESP8266 LUA脚本语言开发: 外设篇-串口
https://nodemcu.readthedocs.io/en/master/modules/uart/ 串口发送数据 发送一个16进制到串口 uart.write(0, 0xaa) 注: 之所以 ...
- pycharm配置docker
- Unity Profiler 记录
版本 Unity 2018.4.6f1 空包 development build 魅蓝 note3 OPPO R9 VIVO x9 华为 P8 青春版 小米 8 SE iphone se Other ...
- bootstrap-switch使用
bootstrap 的开关. 引入相关文件: <link href="https://cdn.bootcss.com/bootstrap-switch/4.0.0-alpha.1/cs ...
- eclipse maven项目如何将所有的jar包复制到lib目录下?
1.情景展示 我们知道,maven项目的jar包并不存在于项目当中,项目所需的jar包都保存在本地仓库中,如果本地仓库没有,会从配置的中央仓库下载,如果中央仓库也没有就会报错: 如上图所示,我想将 ...
- 改善java程序的151个建议
<编写高质量代码-改善java程序的151个建议> --秦小波 第一章.开发中通用的方法和准则 1.不要在常量和变量中出现易混淆的字母 long a=0l; --> long a=0 ...
- cmake打印shell
cmake链接库失败时,可通过打印路径下对应的lib来定位问题 execute_process(COMMAND ls -lt ${CMAKE_CURRENT_SOURCE_DIR}/lib #执行sh ...
- 数据迁移最快方式,多线程并行执行 Sql插入
前言: 由于系统升级,新开发的系统对数据验证,及数据关联做了很多优化,现需要将原历史版本的数据迁移到新系统中:原数据库大约有 1千多万数据,大约 50个表. 历史数据库命名为:A. 新系统库暂命名为 ...
- 解决Chrome插件安装时程序包无效【CRX_HEADER_INVALID】的错误
将[.crx]后缀的文件拖拽至谷歌浏览器开发者模式下的扩展程序管理页签时,报错[CRX_HEADER_INVALID],即此插件无效的错误. 安装失败的原因 原因在于谷歌浏览器在新版本中添加对第三方插 ...
- go中interface空指针不为nil判断方法
interface空指针不为nil 当把一个空指针对象赋值给一个interface后,再判断!= nil就不再成立了 代码如下 package main import "fmt" ...