函数模板
函数模板的作用?
用来实现功能相同的函数统一的功能 ,避免因为功能重复导致冗杂
比如:
不同类型比较大小的函数 需要些很多个不同的返回类型 所以需要很多函数 使用函数模板可以避免这个情况
代码示例
#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:父类和子类都是模板类的时候 子类的模拟类型可以传递到父类中去