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.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
随机推荐
- [C7] 支持向量机(Support Vector Machines) (待整理)
支持向量机(Support Vector Machines) 优化目标(Optimization Objective) 到目前为止,你已经见过一系列不同的学习算法.在监督学习中,许多学习算法的性能都非 ...
- Conda和Python的国内安装源
Conda和Python的国内安装源 Windows系统: 更换python国内源的方法. 在"C:\Users[xxxx]\pip\pip.ini"文件中配置如下内容(没有则新建 ...
- SpringMVC详细流程(一)
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模 ...
- (day56)八、删除框、批量创建、分页器组件
目录 一.ajax结合sweetalert实现删除按钮的动态效果 二.bulk_create批量插入数据 三.自定义分页器 (一)手动推导 (二)自定义分页器 (1)模板 (2)用法 一.ajax结合 ...
- PointNet++作者的视频讲解文字版
转载请注明本文链接: https://www.cnblogs.com/Libo-Master/p/9759130.html PointNet: Deep Learning on Point Sets ...
- 树莓派包含python2.7系统路径
- C实现string字符串
在C中实现string字符串,使用typedef将string定义为char *. #include <stdio.h> #include <stdlib.h> #includ ...
- 这一次,彻底弄懂 JavaScript 执行机制
本文转自https://juejin.im/post/59e85eebf265da430d571f89#heading-4 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还 ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products 数学 暴力
D. Power Products You are given n positive integers a1,-,an, and an integer k≥2. Count the number of ...
- UOJ Easy Round #5
Preface 本着刷遍(只刷一遍)各大OJ的原则我找到了一场UOJ的比赛 无奈UOJ一般的比赛难度太大,我就精选了UER中最简单的一场打了一下,就当是CSP前的练习吧 A. [UER #5]万圣节的 ...