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.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
随机推荐
- Jike_Time-决策树
根节点 非叶子节点(决策点) 叶子节点(决策结果) 分支 熵代表混乱程度 信息增益 构造树的基本想法是随着树深度的增加.节点的熵迅速地降低.熵降低的速度越快越好,这样我们有望得到一颗高度最矮的决策树 ...
- [PHP] 破Laravel白屏问题
可能解决方法如下: 1.Nginx在配置文件中添加 location / { try_files $uri $uri/ /index.php?$query_string; } 2.app ...
- 常见算法合集[java源码+持续更新中...]
一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...
- 第02组 Beta冲刺(4/5)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 讨论校园百科究竟如何实现,并分配了任务 提交记录(全组共用) 接下来的计划 加快校园百科的进度 准备Beta版本的汇报 还 ...
- 深度解密Go语言之context
目录 什么是 context 为什么有 context context 底层实现原理 整体概览 接口 Context canceler 结构体 emptyCtx cancelCtx timerCtx ...
- 生成 RSA 公钥和私钥的方法
在使用 RSA 加密算法时,需要使用到一对 公钥 和 私钥,生成 公钥 和 私钥 需要借助 openssl 这款工具,下载这款工具的地址如下: http://slproweb.com/products ...
- Srinath总结 架构师们遵循的 30 条设计原则
作者:Srinath 翻译:贺卓凡,来源:公众号 ImportSource Srinath 通过不懈的努力最终总结出了 30 条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架构 ...
- .net core EF Core 调用存储过程
在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.F ...
- JVM的监控工具之jmap
参考博客:https://www.jianshu.com/p/a4ad53179df3 jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件 ...
- Spring源码系列 — Resource抽象
前言 前面两篇介绍了上下文的启动流程和Environemnt的初始化,这两部分都是属于上下文自身属性的初始化.这篇开始进入Spring如何加载实例化Bean的部分 - 资源抽象与加载. 本文主要从以下 ...