C++之函数模板和类模板

函数模板和类模板

c++提供了函数模板。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就叫做函数模板
类模板与函数模板的定义和使用类似,使用前景,有时候有两个或多个类,其功能是相似的,仅仅是数据不同,则用到类模板


前言

函数模板
类模板
模板
模板函数
模板类
对象

一、函数模板定义语法

1.函数模板定义形式

template <类型形式参数表>
  	类型形式参数的形式为
  		typename T1,typename T2,typename T3.........typename Tn
  		class T1,class T2,class T3.......class Tn
 //函数模板声明
 	template <类型形式参数表>
 	类型 函数名 (形式参数表)
 	{
     语句序列
    }

2.函数模板实例—做函数参数

#include<iostream>
using namespace std;

template<typename T,typename T2>
void sortArray(T *a,T2 num)
{
  T tmp;
  int i,j;
  for(i =0;i<num;i++)
  for (j=i+1;j<num;j++)
  {
   if(a[i]<a[j])
   {
    tmp=a[i];
    a[i]=a[j];
    a[j]=a[i];
   } 
  }
}
template <class T>
void printT(T *a,int num)
{
  for(int i=0;i<num;i++)
  {
  cout<<a[i]<<" ";
  }
}
void main()
{
char a[]="adbcf";
int num=strlen(a);
//输出排序之前的字符串
printT<char>(a,num);
//输出排序之后的字符串
sortArray<char,int> (a,num);
printT<char>(a,num);
return ;}   

3.普通函数和模板函数的区别

  • 普通函数的调用:可以进行隐式的类型转换
  • 函数模板函数的调用(本质:类型参数化)
    将严格的按照类型进行匹配,不会进行自动类型转换

4.函数模板机制结论

1.编译器从函数模板通过具体类型产生不同的函数
2.编译器会对函数模板进行两次编译
两次编译地方
1、在声明的地方对模板代码本身进行编译
2、在调用的地方对参数替换后的代码进行编译

二、类模板

1.类模板定义

类模板由模板声明和类说明构成
	template <类型形式参数表>
	类声明

(1)案例演示

template<typename T>
class A
{
public:
	A(T t)
	{
	this->t=t;
	}
public:
    T t;
}
void main()
{
 A<int>    a(100);
 A<char>   b('z');
 return ;
}

(2)结论

1、类模板用于实现类所需数据的类型参数化
2、类模板在表示如数组、表、图等数据结构显得特别重要
通过类模板可以让数据类型和算法进行有效分离

2.从模板类派生普通类

template <typename T>
class A{
public:
 	A(T a)
 	{
 	this->a =a;
 	}
public:
	void printA()
	{
	cout<<"a="<<a<<endl;
	}
public:
	 T a;
}
class B::public A<int>
{
public:
	B(int a,int b)::A<int>(a)
	{
	 this->b =b;
	}
	void printB()
	{
	cout<<"a="<<a<<"b="<<b<<endl;
	}
private:
 	int b;
 }
 void main()
 {
 B b1(1,2);
 return ;
 }

1、子模板类派生时,需要具体化模板类,c++编译器需要知道
2、父类的数据类型具体是什么样子的,要知道,父类说咱的内存大小是多少,只有数据类型固定下来,才知道如何分配内存

3、从模板类派生模板类

template <typename T>
class A{
public:
 	A(T a)
 	{
 	this->a =a;
 	}
public:
	void printA()
	{
	cout<<"a="<<a<<endl;
	}
public:
	 T a;
}
template<typename T>
class c:public A<T>
{
public:
 	c(T c, T a):A<T>(a)
 	{
 	this->c=c;
 	}
 	void printC()
 	{
 	cout<<"c:"<<c<<endl;
 	}
protected:
	T c;
}
void main()
{
 c<int> c1(1,2);
 printC();
 return;
}

总结

1、模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属
2、模板用于逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟道xn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值