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.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
随机推荐
- JMeter面试题
1.Jmeter怎么录制脚本,怎么过滤,线程组有哪些内容? jmeter可以使用第三方的录制工具(badboy)或者使用jmeter自带的HTTP代理服务器录制脚本功能 jmeter录制原理:通过ht ...
- [C2W1] Improving Deep Neural Networks : Practical aspects of Deep Learning
第一周:深度学习的实用层面(Practical aspects of Deep Learning) 训练,验证,测试集(Train / Dev / Test sets) 本周,我们将继续学习如何有效运 ...
- pindel及breandancer安装
1.安装pindel需要依赖htslib https://github.com/samtools/htslib.git mv htslib htslib1 autoheader # If using ...
- ORB-SLAM2 地图保存
一.简介 在ORB-SLAM2的System.h文件中,有这样一句话:// TODO: Save/Load functions,让读者自己实现地图的保存与加载功能.其实在应用过程中很多场合同样需要先保 ...
- Luogu P5363 [SDOI2019]移动金币
话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一 ...
- win10 + 3ds Max 2014 问题记录
3ds Max 下载: https://zixue.3d66.com/popsoft_201.html VRay 下载: https://zixue.3d66.com/softhtml/showsof ...
- B1013
python语言运行这道题有一个点运行超时,需要对求素数的算法进一步的优化 def isPrime(n): if n <= 1: return False i = 2 while i * i & ...
- Token认证,如何快速方便获取用户信息
背景 我们有一个Web项目,这个项目提供了很多的Rest API.也做了权限控制,访问API的请求必须要带上事先认证后获取的Token才可以. 认证的话就在Filter中进行的,会获取请求的Token ...
- scss和sass最大的区别
重新接触了一下sass语法,在vscode的用的easysass插件.ctrl+S就可以自动编译成css文件.需要自己配置生成css路径 遇到的一个坑就是sass官网几乎全是写的sass,示例中全部是 ...
- eclipse 下载、安装、创建java文件工程、运行---Windows 10
一.Eclipse Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的插 ...