(泛式编程)函数模板和类模板

函数模板

函数模板的作用?

用来实现功能相同的函数统一的功能 ,避免因为功能重复导致冗杂
比如:
不同类型比较大小的函数 需要些很多个不同的返回类型 所以需要很多函数 使用函数模板可以避免这个情况

代码示例

#include<iostream>
using namespace std;


int Max(int x,int  y)
{
	return x > y ? x : y;
}
float Max(float x, float  y)
{
	return x > y ? x : y;
}

int main()
{
	int x = 3;
	int y = 6;
	cout << "MAX(x,y):" << Max(x, y) << endl;

	float m = 2.4;
	float n = 4.4;
	cout << "MAX(x,y):" << Max(m, n) << endl;
	return 0;
}

效果和下面相同

#include<iostream>
using namespace std;

template <typename T>
T Max(T x,T y)
{
	return x > y ? x : y;
}

int main()
{
	int x = 3;
	int y = 6;
	cout << "MAX(x,y):" << Max(x, y) << endl;   //自动推导
	cout << "MAX(x,y):" << Max<int>(x, y) << endl;//显示 手动指定

	float m = 2.4;
	float n = 4.4;
	cout << "MAX(x,y):" << Max(m, n) << endl;
	cout << "MAX(x,y):" << Max<float>(m, n) << endl;
	return 0;
}

函数模板的概念

    所谓函数模板就是建立一个通用的函数,其函数类型和函数的形参不具体指定,用一个虚拟的类型来表示。
   这个通用类型就称为函数模板 凡是函数体相同的类型都可以通过函数模板来代替,不必多次实现

定义形式:
模板说明 函数定义 模板调用

//typename 和 class效果一样
template<类型形式参数表>
类型 函数名(函数参数表)
{
函数体
}

函数模板和函数重载

函数模板和函数重载可以同时存在 当函数模板和函数重载都匹配一个函数的时候 编辑器会优先调用普通的函数 如果显示的调用函数模板 则编辑器会调用函数模板

函数模板的调用机制

在调用函数模板的时候 针对使用不同的类型时 编辑器会自动生成相关的普通函数代码

类模板

为什么需要类模板?

有多个类 其功能相同 仅仅是 数据类型不相同

#include<iostream>
using namespace std;



template <typename T>
class A {
public:
	A(T t) { this->t = t; }
	T Gett() { return this->t; }

private:
	T t;
};

int main()
{
	A<int> a(20);
	A<char> b('dog');
	cout << "a:" << a.Gett() << endl;
	cout << "b:" << b.Gett() << endl;
	return 0;

}

这里面的A可以表示很多类 其中功能相同 输出如下
在这里插入图片描述

注意: 在实例化对象的时候 要具体的指示用的什么数据类型

类模板以及继承

#include<iostream>
using namespace std;



template <typename T>
class A {
public:
	A(T t) { this->t = t; }
	T Gett() { return this->t; }

private:
	T t;
};

//一般类继承模板类 需要只能指定
class B :public A<int> {
public:
	B(int b):A(50) { this->b = b; }
private:
	int b;
};



//模板类继承模板类 需要指定
template <typename Tb>
class C :public A<int> {
public:
	C(Tb c) :A<Tb>(c) { this->c = c; }
private:
	Tb c;
};



int main()
{
	A<int> a(20);
	A<char> b('dog');

	B c(20);

	C<int> d(500);
	cout << "a:" << a.Gett() << endl;
	cout << "b:" << b.Gett() << endl;
	cout << "c:" << c.Gett() << endl;
	cout << "d:" << d.Gett() << endl;
	return 0;

}

1:父类是一般类 子类模板类 和普通继承类似
2:父类模板类 子类一般类 需要在继承是特别指定一下 如上
3:父类和子类都是模板类的时候 子类的模拟类型可以传递到父类中去

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值