模板

模板:C++的泛型机制,通用性,为了摆脱对类型的依赖

模板:函数模板 类模板

1.函数模板--》模板作函数用

template<typename T>//函数模板

T Sum(T a,T b)

{

return a+b;

}

调用点:Sum<int>(10,20);

2.模板函数

int Sum(int a,int b)

{

return a+b;

}

3.模板实例化

(1)定义点:只编译模板的头部-->告诉编译器有这样一个模板存在

  (2)调用点:模板实例化后的模板函数

4模板实参推演:

(1)不能产生二义性

(2)有实参

5.模板特例化(专用)

(1)完全特例化(全特化)--->一个类型(函数模板)

(2)部分特例化(偏特化)--->一部分类型

6.类型参数 typename | class<>

template<typename T>

bool Compare(T a,T b)

{

return a>b;

}

template<>//模板特例化

bool Compare(const char*a,const char*b)

{

return strcmp(a,b)>0;

}

 

模板的重载:1>3>2

1.普通函数版本

2.模板版本

3.模板特例化版本

 

为什么模板的整个定义都在.h中?

普通函数  头部(声明)  .h

实现(定义)  .cpp

目标文件不会过大,整个定义点编译一次,共享库方式加载进来

模板在编译阶段以编译单元(在一个源文件编译时看不到其他源文件)方式编译,.cpp有Sum模板,但是没有调用点,没有模板实例化,也就没有模板函数生成。

main.cpp

template <typename T>

T Sum(T,T);

int main()

{

Sum<int>(10,20);//int Sum(int,int) ,调用点实例化生成函数符号?Sum@@YAHHH@Z   ,要有函数声明--》未定义区--》整个程序没有模板函数生成

return 0;

}

Sum.h在预编译阶段处理,头文件内容展开,源文件整个模板定义。(调用点+定义点)模板函数

类模板:不允许实参推演

1.类模板

template <typename T>

class Node

{

public:Node(T val=T ())

        :mdata(val),pnext(NULL)

{}

private:

T mdata;

Node<T> *pnext;

};

int main()

{

Node<int> node(10);

return 0;

}

2.模板类

class Node<int>

{

public:

Node(int val=T());

private:

int mdata;

Node<int>*pnext;

};

3.类模板的实例化:选择性实例化(使用哪个函数,类模板实例化哪个函数)

4.Vector容器:拷贝构造模板会退化成构造函数

5.容器适配器:

(1)类型参数:typename | class

(2)非类型参数:简单的变量(不是浮点型|类类型)

(3)模板

6.链表:

typename和class的区别:

typename  声明模板中的一个类型

<>模板类型参数列表中,class 类标识,typename声明模板中的一个类型

7.类模板特例化

完全特例化 :模板的逻辑不能满足一个类型需求

部分特例化:模板逻辑不能满足一部分类型需求

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值