一、模板概论

c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函 数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数 就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函 数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板 中的虚拟类型,从而实现不同函数的功能。 c++提供两种模板机制:函数模板和类 模板 类属 - 类型参数化,又称参数模板 总结: 模板把函数或类要处理的数据类型 参数化,表现为参数的多态性,成为类属。 模板用于表达逻辑结构相同,但具体 数据元素类型不同的数据对象的通用行为。

如何实现一个通用的交换函数呢?

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}

使用函数重载虽然可以实现,但是有一下几个不好的地方: 1. 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数 2. 代码的可维护性比较低,一个出错可能所有的重载均出错 那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

函数模板格式

template<Typename T1, Typename T2, Typename T3....>

返回值类型 函数名(参数列表){}

template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}

二、函数模板和普通函数区别

函数模板不允许自动类型转化 普通函数能够自动进行类型转

//函数模板
template<class T>
T MyPlus(T a, T b){
T ret = a + b;
return ret;
}
//普通函数
int MyPlus(int a,char b){
int ret = a + b;
return ret;
}
void test02(){
int a = 10;
char b = 'a';
//调用函数模板,严格匹配类型
MyPlus(a, a);
MyPlus(b, b);
//调用普通函数
MyPlus(a, b);
//调用普通函数 普通函数可以隐式类型转换
MyPlus(b, a);
//结论:
//函数模板不允许自动类型转换,必须严格匹配类型
//普通函数可以进行自动类型转换
}

函数模板和普通函数 都识别 优先选择普通函数

/函数模板和普通函数 都识别 如果选择函数模板 加<>

三、类模板

类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个 类,其功能是相同的,仅仅是数据类型不同。 类模板用于实现类所需数据的类型参数化

template<class NameType, class AgeType>
class Person
{
public:
Person(NameType name, AgeType age)
{
this->mName = name;
this->mAge = age;
}
void showPerson()
{
cout << "name: " << this->mName << " age: " << this->mAge <
< endl;
}
public:
NameType mName;
AgeType mAge;
};
void test01()
{
//Person P1("德玛西亚",18); // 类模板不能进行类型自动推导
Person<string, int>P1("德玛西亚", 18);
P1.showPerson();
}

类模板做函数参数:

template<class NameType, class AgeType>
class Person{
public:
Person(NameType name, AgeType age){
this->mName = name;
this->mAge = age;
}
void PrintPerson(){
cout << "Name:" << this->mName << " Age:" << this->mAge <<
endl;
}
public:
NameType mName;
AgeType mAge;
};
//类模板做函数参数
void DoBussiness(Person<string,int>& p){
p.mAge += 20;
p.mName += "_vip";
p.PrintPerson();
}
int main(){
Person<string, int> p("John", 30);
DoBussiness(p);
system("pause");
return EXIT_SUCCESS;
}

类模板派生普通类

//类模板
template<class T>
class MyClass{
public:
MyClass(T property){
this->mProperty = property;
}
public:
T mProperty;
};
//子类实例化的时候需要具体化的父类,子类需要知道父类的具体类型是什么样的
//这样 c++编译器才能知道给子类分配多少内存
//普通派生类
class SubClass : public MyClass<int>{
public:
SubClass(int b) : MyClass<int>(20){
this->mB = b;
}
public:
int mB;
};

类模板派生类模板

//父类类模板
template<class T>
class Base
{
T m;
};
template<class T >
class Child2 : public Base<double> //继承类模板的时候,必须要确定基类的大
小
{
public:
T mParam;
};
void test02()
{
Child2<int> d2;
}

类模板类内实现

template<class NameType, class AgeType>
class Person
{
public:
Person(NameType name, AgeType age)
{
this->mName = name;
this->mAge = age;
}
void showPerson()
{
cout << "name: " << this->mName << " age: " << this->mAge <
< endl;
}
public:
NameType mName;
AgeType mAge;
};
void test01()
{
//Person P1("德玛西亚",18); // 类模板不能进行类型自动推导
Person<string, int>P1("德玛西亚", 18);
P1.showPerson();
}

c++笔记 函数模板相关推荐

  1. 【C++学习笔记2】构造函数、析构函数、函数多态、抽象类、函数模板

    这次笔记介绍构造函数.析构函数.函数多态.抽象类.函数模板 一.构造函数 1.在定义对象,构造函数程序将自动执行,他的类型跟类名一致 函数声明最好放在自己的类里面,这样才符合类的封装,也可以像下面一样 ...

  2. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  3. C++ 函数模板和排序的函数模板——学习笔记

    我们在使用重载函数时,只是使用了函数名,而函数体还是得分别定义,在C++中函数模板为我们很好的解决了这个问题. 1.函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函 ...

  4. C++学习笔记35:函数模板

    函数模板 函数模板的目的 设计通用的函数,以适应广泛的数据型式 函数模板的定义格式 template<模板型式参数列表>返回值型式 函数名称(参数列表): 原型:template<c ...

  5. c++ 函数模板_C/C++编程笔记:C++入门知识,深入解析C++函数和函数模板

    本篇要学习的内容和知识结构概览 函数的参数及其传递方式 1. 函数参数传递方式 传值: 传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存 传地址值: 将实参所对应的内存空间的地址值 ...

  6. C++笔记函数重载函数模板

    #include <iostream>using namespace std;class Student { private:int num;int score; public:void ...

  7. c++ template笔记(1)模板函数

    1.定义函数模板 template <typename T> inline T const& max (T const& a, T const& b) {// if ...

  8. C++提高部分_C++类模板与函数模板的区别---C++语言工作笔记088

    然后我们再去看看类模板和函数模板的区别, 类模板没有自动类型推导,这一种使用方式. 类模板在模板参数列表中是可以有默认参数的. 用例子去说明一下,可以看到我们写了一个Person类,然后 这个类有两个 ...

  9. C++提高部分_C++普通函数与函数模板调用规则---C++语言工作笔记085

    然后我们再来看一下普通函数和函数模板的调用规则 可以看到有4个, 1.如果函数模板和普通函数都可以地调用的时候,优先调用普通函数 2.可以通过空模板参数列表,强制调用,函数模板 3.函数模板可以发生函 ...

最新文章

  1. Science:领导决策的计算和神经生物学基础
  2. 如何实现RESTful Web API的身份验证
  3. requests记录
  4. 四十一、Python统计模块statistics
  5. PHP系统能不能加爬虫,php能做爬虫吗
  6. Hadoop生态hive(四)数据类型
  7. MySQL笔记-解决...mysql.sock (13)(两种情况会产生此问题)
  8. 品质生活在于细节 8月6日张朝阳“做饭直播”带货厨房好物
  9. Spring发送基于freemarker模板的邮件
  10. ubuntu 1804.1 升级失败:Hash Sum mismatch
  11. spring 从源码学设计1-doDispatch()
  12. 触摸屏驱动学习并移植
  13. 金蝶云星空根据采购价目表写入自定义采购入库单是否价目表字段
  14. 【08月02日】指数估值排名
  15. 计算机网络 网络安全问题概述
  16. JavaScript绘制矢量图
  17. 游戏开发核心技术之-存档与读档(1)
  18. 叮咚叮咚,京东叮咚音箱Skill开发之路
  19. 【故障解决】ORA-06502错误解决
  20. ubuntu系统安全UFW

热门文章

  1. 三大数据模型:星型模型、雪花模型、星座模型
  2. Java Method类简介说明
  3. 联合体Union详解
  4. 仿华为EmotionUI 3.0滑动效果
  5. 使用JCplayer在自己的网站上播放视频
  6. SQLTools: 一款全功能的 VScode 轻量级数据库管理插件
  7. 自学3D建模能学会吗?需要多久时间?
  8. 企业级服务器硬盘500g,稳定最重要 西数RE4企业级硬盘测试
  9. MatLab启动报错MATLAB is selecting SOFTWARE OPENGL rendering. License checkout failed.
  10. PolarDB数据库的CSN机制