模版
C++
提供了函数模板
(function template)
。
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。
凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
1
)
C++
提供两种模板机制:
函数模板、类模板
2
)类属
——
类型参数化
,又称参数模板
使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。
总结:
模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属。
模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。
#include
<iostream>
using
namespace
std;
//函数模板
//template关键字<类型参数 可以有多个 逗号隔开> 函数返回值类型 函数名 (形参)
template
<
typename
T ,
typename
K >
//模板头
void
Swap(T& a, K& b) {
T temp = a;
a = b;
b = temp;
}
template
<
typename
T>
//模板头
void
mySwap(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
int
main(){
//交换 int 变量的值
int
n1 = 100, n2 = 200;
Swap(n1, n2);
mySwap<
int
>(n1,n2);
//当函数调用能自动推导出 T K U所有的类型 可以在函数调用时省略<>
mySwap(n1, n2);
//交换 float 变量的值
float
f1 = 12.5, f2 = 56.93;
Swap(f1, f2);
cout << f1 <<
", "
<< f2 << endl;
//交换 char 变量的值
char
c1 =
'A'
, c2 =
'B'
;
Swap(c1, c2);
cout << c1 <<
", "
<< c2 << endl;
//交换 bool 变量的值
bool
b1 =
false
, b2 =
true
;
Swap(b1, b2);
cout << b1 <<
", "
<< b2 << endl;
return
0;
}
类模版
- 类模板用于实现类所需数据的类型参数化
- 类模板在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响
//
类的类型参数化
抽象的类
//
单个类模板
template<typename T>
class A
{
public:
A(T t)
{
this->t = t;
}
T &getT()
{
return t;
}
protected:
public:
T t;
};
{
//
模板了中如果使用了构造函数
,
则遵守以前的类的构造函数的调用规则
A<int> a(100);
a.getT();
printAA(a);
return ;
}
|
构造函数
没有问题
普通函数
没有问题
友元函数:用友元函数重载
<< >>
friend ostream& operator<<
<T>
(ostream &out, Complex<T> &c3) ;
友元函数:友元函数不是实现函数重载(非
<< >>
)
1
)需要在类前增加
类的前置声明
函数的前置声明
template
<
typename
T>
class
Complex;
template
<
typename
T>
Complex<T> mySub(Complex<T> &c1, Complex<T> &c2);
2
)类的内部声明
必须写成
:
friend Complex<T>
mySub <T>
(Complex<T> &c1, Complex<T> &c2);
3
)友元函数实现
必须写成:
template
<
typename
T>
Complex<T> mySub(Complex<T> &c1, Complex<T> &c2)
{
Complex<T> tmp(c1.a - c2.a, c1.b-c2.b);
return
tmp;
}
4
)友元函数调用
必须写成
Complex<
int
> c4 = mySub
<int>
(c1, c2);
cout<<c4;
结论:友元函数最好只用来进行
左移
友移操作符重载。
小结:
- 模板是C++类型参数化的多态工具。C++提供函数模板和类模板。
- 模板定义以模板说明开始。类属参数必须在模板定义中至少出现一次。
- 同一个类属参数可以用于多个模板。
- 类属参数可用于函数的参数类型、返回类型和声明函数中的变量。
- 模板由编译器根据实际数据类型实例化,生成可执行代码。实例化的函数模板称为模板函数;实例化的类模板称为模板类。
- 函数模板可以用多种方式重载。
- 类模板可以在类层次中使用 。