C++复习五:泛型编程及C++的类型转换

泛型编程

泛型编程是从一个抽象层面描述一种类型的算法,不管容器类型是什么,是一种不同于OOP的角度来抽象具体算法

C++用模板来实现泛型编程,模板分为函数模板和类模板

函数模板

template<class/typename T> //告诉编译器遇到T不要报错
mySwap(T &a, T &b) //类型参数化,在使用时会进行自动类型推导,将a和b的类型传给T

mySwap<int>(a, b) //显式指定类型

在使用函数模板时,一定要让编译器知道T是什么类型,否则无法使用

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

类型转换

普通函数可以进行隐式类型转换(显示表示)
函数模板不可以

调用顺序

当普通函数对函数模板进行了函数重载时,优先调用普通函数,如果普通函数出错,则出错,不会再去调用函数模板
如果需要强制调用函数模板,可以加 <> 来调用

函数模板也可以进行函数重载

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

模板的机制

  • 模板并不是万能的,不能通用所有的数据类型
  • 模板不能直接调用,生成后的模板函数才可以调用
  • 函数模板会进行两次编译,第一次对函数模板进行编译,检查语法错误,第二次对替换T 的类型进行编译

函数的局限性

模板不能解决所有的类型,可以使用第三代具体化来实现

//函数模板
template<class T>
bool myCompare(T &a, T&b)
{
   
	if(a ==b)
	{
   
		return true;
	}
	return false;
}

//第三代具体化,如果能直接匹配,就优先调用
template bool myCompare<Person>(Person &a, Person &b)
{
   
	if(a.age == b.age)
	{
   
		return true;
	}
	return false;
}

类模板

template <class NameType, class AgeName = int> //可以有默认类型参数
class Person
{
   
public:
	Person(NameType name, AgeType age)
	{
   
		m_name = name;
		m_age = age;
	}
	
	NameType m_name;
	AgeType age;
};

Person<string, int> p("heihei",100);  //函数模板可以进行自动类型推导,而类模板不行

类模板的成员函数在未确定时不会创建,只有确认了才会创建


类模板做函数参数

指定传入类型

template<class NameType, class AgeType>
class Person
{
   
public:
    Person(NameType name, AgeType age)
    {
   
        this->m_name = name;
        this->m_age = age;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值