一、函数模板
重载:参数个数不同,类型不同可以构成重载
将数据类型当参数进行传递(将数据类型和算法进行分离)
//函数模板:用template去声明模板、<typename 类型名称1,typename 类型名称2>-----模板声明只对dang当前函数有效
1.mySwap(a,b) //隐式调用、不指名类型 让编译器自动推导
cout ----标准输出流变量
2.函数模板可以隐式调用,但不支持隐式的类型转换
强制转换: int a = 10;int b = 20; char c = 'A'
print<int>(a,c)
3.函数模板和普通函数都可以调用的情况下,优先diao调用函数模板--可以通过< >强制调用模板函数,内部类型可写可不写。
4.模板机制实现,两次编译
1.对模板自身编译
2.在调用的位置对具体类型进行编译
二、类模板
template<typename .T>
class TestA
{
public:
TestA(T a)
{
this->a = a;
}
void print()
{
cout << a <<endl;
}
private:
T a
};
栈------局部变量
堆------自己申请
数据区---静态、局部变量
代码区---执行代码/常量
1.类模板的派生和继承
2.类模板的使用
类成员的函数实现:(1)在内部 (2)在外部
类模板成员函数可以在内部实现,包括友元函数都可以在内部实现
!!!注意友元函数即使在类的内部实现,它也是一个友元函数,不是类的成员函数
《运算符重载会使用友元函数打破封装》
《类里如果有友元函数一般放在类的开头》
3.在类的外部实现类模板
*类模板成员函数如果在lei类的外部进行实现,必须全部写成函数模板
*类的后面要跟模板参数列表
*类的内部<T>可加可不加,但是在外部一定要加
*运算符重载< >作为友元函数使用的时候在进行友元声明的时候在函数名和
间加<T >