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.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
随机推荐
- Vue入门案例(二)
创建一个 .html 文件,然后通过如下方式引入 Vue: <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.js ...
- angular设置全局变量,修改监听变量
创建service.module.ts import { NgModule, ModuleWithProviders } from '@angular/core'; import { SomeShar ...
- Ajax常用例子 Post 和 Get
1. 前台:Post$.ajax({ url: "@Url.Action("Save", "UserFun")", type: " ...
- h5 ios移动端,键盘收起以后页面不归位
$('input,textarea').on('blur',function(){ window.scroll(0,0); }); $('select').on('change',function() ...
- FineUIPro v6.0.0 大版本更新,快来围观!
本月末(2019-09-20),我们会发布激动人心的 FineUI v6.0.0 版本,这个版本将带来一系列的重要更新! 在列举新版本特性之前,我们先来回顾下每次发布大版本的关键时间点: v1.0.0 ...
- 七、Spring之深入理解AOP源码
Spring之深入理解AOP源码 在上一篇博文中,我们对AOP有了初步的了解,那么接下来我们就对AOP的实现原理进行深入的分析. 在之前写的那个AOP示例代码当中有这样一个注解:@Enable ...
- F#周报2019年第18期
新闻 FableConf 2019开始征集提案 2019理事会选举 如同DSL一般的Elmish封装器fable-elmish,可以创建控制台或者终端界面 介绍VS Code的远程开发 F#(.NET ...
- Jar 打包与执行
Java学习笔记之一,用于个人记录.整理自<Head First Java>. 假设有如下目录结构: 程序入口在 Jukebox8.java.这个代码文件开头是有如下这样的包声明语句的: ...
- C# .NET 使用 NPOI 读取 .xlsx 格式 Excel
string filePath = @"C:\Users\yangqinglin\Desktop\test.xlsx"; IWorkbook wk = null; string e ...
- Windows 10应答文件
将其保存为autounattend.xml文件,然后放入到ISO镜像根目录即可 <?xml version="1.0" encoding="utf-8"? ...