C++:C++模板(函数模板与类模板的使用)

函数模板与类模板

作用: C++模板提供了一种通用模具,大大提高了代码的复用性,

实现方式:将类型参数化

模板分类:函数模板、类模板

语法:

(1)template关键字:表示要定义一个模板类型

(2)typename关键字或class关键字: 表示给类型一个泛型名称.

(3)<泛型名称>:放置在typename之后, 特指一种泛型类型,通常为大写.

template <typename T1>

一、函数模板:

(1)函数内部对象的类型在调用函数时才确定(类型动态化)

(2)在函数模板当中:

template <typename T1>只能表示以下一个函数是模板.

template<typename T1>

void fun1(T1 a)

{

}

2函数模板使用:

(1)自动类型推导:必须推导出一致的数据类型T,可以使用

template <typename T>

void fun(T_ n1, T _n2)

{

Char  ch='1';

intn=23;

fun(n,ch);     //error

}

(2)显示指定类型,

fun<int>(n,ch);          //right!

(3)注意:模板必须要确定出T的数据类型,才可以使用

1)普通函数能够进行隐式类型转换:

2)函数模板的自动类型推导,不能进行隐式转换

调用规则:

1.如果普通函数与函数模板都存在(一样),优先调用普通函数

2.可以通过空模板参数列表来强制性调用模板函数,fun<>(a,b);

3.函数模板可以发生重载

4.如果函数模板可以产生更好的匹配,优先调用函数模板.

普通函数需要类型转换时,函数模型只需要推导,则优先选择函数模板.

#include <iostream>
using namespace std;

int Myadd(int a,int b)
{
	cout<<"普通函数"<<endl;
	return a+b;
}

template <class T>
T Myadd(T a,T b)
{
	cout<<"模板函数"<<endl;
	return a+b;
}

void test01()
{
	 int a=10;
	 char b=20;
	 Myadd(a,a);  //调用普通函数不用推导
	 Myadd<>(a,a);//调用模板函数
	 Myadd<int>(a,a);//指定调用模板函数
	 Myadd(a,b);   //调用普通函数因为普通的函数可以自动类型转换
	 //Myadd<>(a,b); //函数模板不会做自动类型转换
}


int main(int argc, char *argv[])
{
	test01();
	return 0;
}

二、类模板

●类模板表示将类中的成员属性模板化(泛型化

●语法:

template <typename T1, typename T2>

{

class Person

public:

T1_ attri1 ;

T2_ attri2;

};

●注意:

类模板实例化对象时没有自动推导类型方式,所以必须显示类型

1 Person<int, int> p1;

●类模板中的泛型类型可以有默认参数,(函数模板也可以有,意义不大,因为有自动推导)

template <typename T1, typename T2=int>

class Person

{

pub1ic:

T1_attri1;

T2_ attri2;

};

●类模板成员函数类外实现:

 template <typename T1,typename T2=int>

class A

{

Public:

A();

};

template <typename T1,

typename T2>

A<T1,T2>: :A()

{

}

注意:类外实现的成员函数,模板不能有默认参数.

●类模板对象作为函数参数:

1.指定传入类型(用的比较多)

void fun(Data<string, int> &d)

{

}

2.参数模板化

template <typename T1,typename T2:

void fun(Data<T1, T2> &d)

{

}

template <typename T>

void fun(T &d)

}

●类模板与继承:

。当子类继承的父类是一个类模板时,子类在声明的时候,要指定父类中的类型

。如果要灵活指定父类中的T类型,子类也需要实现为类模板.

template<typename T>

class Base

{

public:

T num;

};

class Son: pub1ic Base<int>

public:

string name;

};

template<typename T1,typename T2>

class Son1: public Base<T1>

{

pub1ic:

T2 id;

};

int main()

{

Son1<int,char>s1;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

এ᭄星辰

混口饭吃。。。。。

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

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

打赏作者

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

抵扣说明:

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

余额充值