模板

模板是一种工具,模板可以使程序员能建立具有通用类型的函数库与类库;

模板具有两种不同的形式;

  • 函数模板
  • 类模板

函数模板

当一个add()函数接收两个参数,因为某种特定情况,所传入的实参数据类型不同,两个函数主体内行为处理是一样的;一个是处理int型的,另一个是处理double型的,

这种情况时,可以写出不同的形参的同名函数,构成函数重载。但这样的零散函数并不是很优雅,开发时还增加编程量;

出现这种情况时,使用函数模板来解决,即可以实现对于任何一个类型T的两个对象a,b的功能,也可以使函数调用add(a,b)合法,让编译器理解为两个相同类型的实体交换;

模板使用格式:函数模板提供了具有处理相同功能的一类函数的抽象,它以任意类型T为参数,其定义形式如下:

template <typename 参数化类型名>
<返回类型> <函数名> (<参数表>)
{
//<函数体> }
例如: template <typename T>
T add(T a,T b)
{
//....
}

实例代码

以下代码分别以成员函数重载,与函数模板使用;

#include "stdafx.h"

//两个同名函数,传入参数的数据类型不同时,写两个函数构成重载函数才能使用。
//其中一个add()函数传入两个int型;
//double Add(int a,int b)
// {
// return a + b;
// }
//
////其中一个add()函数传入两个double型
// double Add(double a , double b)
// {
// return a + b;
// } //写成模板形式两个相同类型的实参数值,匹配到第一个模板函数
//因为减少了重载的编码量,使用模板后代码量减少,且程序变得更加优雅~~
template <typename T>
T Add(T a, T b)
{
return a + b;
} int _tmain(int argc, _TCHAR* argv[])
{ //下面的函数传入两个int型的数值
double na = Add(10.2, 20.5); //下面两个参数都是double型的数值
double fa = Add(10, 20); return 0;
}

重载函数模板

函数模板也可以像函数重载一样使用,例如传入的实参如果是两个不同类型如float、int,或者是函数定义的形参个数不一致的时候会自定调用与传入实参个数类型相匹配的函数;

函数模板匹配的优先次序

在使用函数模板后,调用函数还是会有优先顺序的。

1.完全匹配

当匹配普通函数的形参时,则优先调用普通函数;

2.匹配函数模板

如果不匹配普通函数,则视其数据实参的类型来选择重载函数模板中的一个。

3.类型自动转换后匹配

在测试过程中,类型转换顺序取由左到右的第一个参数类型进行数据类型转换,产生参数匹配的函数;

实例代码

#include "stdafx.h"

//两个同名函数,传入参数的数据类型不同时,写两个函数构成重载函数才能使用。
//其中一个传入两个int型;
//double Add(int a,int b)
// {
// return a + b;
// }
//
////其中一个传入两个double型
// double Add(double a , double b)
// {
// return a + b;
// } ////两个相同类型的实参数值,匹配到第一个模板函数
//因为减少了重载的编码量,使用模板后代码量减少,且程序变得更加优雅~~
template <typename T>
T Add(T a, T b)
{
return a + b;
} //重载函数模板
template <typename T>
T Add(T a)
{
return a;
} //不同的类型可以定义两个模板类型
template <typename T1, typename T2>
T2 my_add(T1 NumA, T2 NumB)
{
return NumA + NumB;
} int _tmain(int argc, _TCHAR* argv[])
{ //下面Add()函数有两个参数;
double na = Add(10.2, 20.5); //下面Add()函数只有一个参数;
double fa = Add(10); //下面的函数调用两个参数自动匹配模板类型
cout << my_add(1, 3.4) << endl;
cout << my_add(1.2, 'A') << endl;
cout << my_add(2, 'A') << endl; return 0;
}

模板特化

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using std::cout; using std::endl; template <typename T>
T MyMax(const T NumA, const T NumB) {
return NumA < NumB ? NumB : NumA;
} template <>
const char* MyMax<const char*>(const char* pStrA, const char* pStrB) {
return (strcmp(pStrA, pStrB) < 0) ? pStrB : pStrA;
}
int _tmain(int argc, _TCHAR* argv[]) {
cout << MyMax("AAAA", "BBBB") << endl;
system("pause");
return 0;
}

类模板

如果要对功能相同、类的实现没有变化,仅类的数据类型不同的各种情况,都要重新定义一种新的类型,将带来较大的重复。为解决这一问题, 可以引进类模板的概念。就是将数组中的元素和链表中的结点的数据类型用一个通用参数T来代替;

类模板的定义格式为:

template <typename T>
class <类名>
{
//类体说明
}

其中template是关键字,<模板参数表>中可以有多个参数,其间用逗号分隔。

:当定义成类模板后,那么成员函数与类应该在同一个文件内。无法分开存放声明与定义;

实例代码

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using std::cout; using std::endl; //声明模板类,类型为T
template <class T> class CVector { public:
CVector(int nCount) : m_nSize(nCount) {
//表示开辟的空间为模板T类型
m_pData = new T[nCount];
memset(m_pData, 0, nCount);
}
~CVector() { delete m_pData; } //重载下标符号,定义重载为T类型
T operator[](int nIndex)
{
return m_pData[nIndex];
}
//如果不用模板的情况应该是char类型
//char operator[](int nIndex)
//{
// return m_pData[nIndex];
//} int fun(); private:
//定义m_pData为模板类型T
T *m_pData;
int m_nSize;
}; //类体外实现成员函数的语法(不能放在cpp中,只能一起放在.h文件中)
template <class T>
int CVector<T>::fun()
{ } int _tmain(int argc, _TCHAR* argv[]) {
//这个时候,T就是int型
CVector<int> objNum(15);
cout << objNum[1] << endl;
system("pause");
return 0;
}

C++学习8-面向对象编程基础(模板)的更多相关文章

  1. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  2. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  3. JAVA学习(五):Java面向对象编程基础

    Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...

  4. [.net 面向对象编程基础] (15) 抽象类

    [.net 面向对象编程基础] (15) 抽象类 前面我们已经使用到了虚方法(使用 Virtual修饰符)和抽象类及抽象方法(使用abstract修饰符)我们在多态一节中说到要实现类成员的重写必须定义 ...

  5. [.net 面向对象编程基础] (16) 接口

    [.net 面向对象编程基础] (16) 接口 关于“接口”一词,跟我们平常看到的电脑的硬件“接口”意义上是差不多的.拿一台电脑来说,我们从外面,可以看到他的USB接口,COM接口等,那么这些接口的目 ...

  6. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

  7. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  8. [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句

    [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...

  9. [.net 面向对象编程基础] (14) 重构

    [.net 面向对象编程基础] (14) 重构 通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然 ...

  10. [.net 面向对象编程基础] (17) 数组与集合

    [.net 面向对象编程基础] (17) 数组与集合 学习了前面的C#三大特性,及接口,抽象类这些相对抽象的东西以后,是不是有点很累的感觉.具体的东西总是容易理解,因此我们在介绍前面抽象概念的时候,总 ...

随机推荐

  1. BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表

    题目链接 LOJ 2529 BZOJ 5308 题解 这么简单的题 为什么考场上我完全想不清楚 = = 对于k个关键点中的每一个关键点\(a\),二分它能一度成为哪些点的最短路起点(显然这些点在一段包 ...

  2. SSM框架中的前后端分离

    认识前后端分离 在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有代码统称为后端. ...

  3. 解决Ubuntu17.04以上系统,yarn init报错

    安装yarn的时候老是装了个cmdtes的东西,官网是说删掉cmdtest重装就行,但是真没用. 正确的解决办法应该是像这位说的一样,先修改一下源,sudo apt update再下载,就能下载到真正 ...

  4. yiming

      关于双城 专家团队 总裁专栏 双城荣誉 诚聘英才 双城著作移民服务 移民专题 移民专刊 移民百科 成功案例 联系我们   澳大利亚 匈牙利 美国 加拿大 欧洲 瓦努阿图 双城集团 双城地产 君益诚 ...

  5. A1061. Dating

    Sherlock Holmes received a note with some strange strings: "Let's date! 3485djDkxh4hhGE 2984akD ...

  6. ASP.NET MVC 网站优化之压缩技术

    压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽. 实现 ActionFilter 来完成 html 的压缩 public class WhitespaceFilterA ...

  7. 右值引用&&

    以下内容参考https://blog.csdn.net/china_jeffery/article/details/78520237 右值引用若不作为函数参数使用,基本等于滥用 右值引用 (Rvalu ...

  8. (string find) 亲和串 hdu2203

    亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. How the Bitcoin protocol actually works

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  10. 1、Python-HelloWorld

    安装 环境下载 https://www.python.org/downloads/ IDE(PyCharm)下载 https://www.jetbrains.com/pycharm/download/ ...