C++入门到精通 ——第三章 模板与泛型

三、模版与泛型

Author: XFFer_

01 模版概念,函数模版定义、调用

1 概述
2 函数模版的定义
3 函数模版的使用
4 非类型模版参数

概述

vector实际上就是一个模版,vector才是一个类

  • 所谓泛型编程是以独立于任何类型的方式编写代码。使用泛型编程时,我们需要提供具体程序实例所操作的类习惯或者值
  • 模版是泛型编程的基础,模版是创建类或者函数的蓝图或者公式。我们给这些蓝图或者公式提供足够的信息,让这些蓝图或者公式真正的转变成具体的类或者函数,发生在编译时
  • 模版支持将类型作为参数的程序设计方式,从而实现了对泛型程序设计的直接支持
函数模版的定义

overloaded function(重载函数)实际上就是两个同名函数,但是形参列表有明显不同。

template<typename T>
T funcadd(T a, T b)
{
   
	T add_result = a + b;
	return add_result;
}
  • 模版定义是用template关键开头的,后边跟<>,里面叫模版参数列表(模版实参)
  • <>里必须有一个模版参数,模版参数前typename/class,模版参数列表里表示函数定义中用到的“类型”“值”
  • 多个模版参数时,需要用多个template <typename A, typename B>
函数模版的使用

和正常调用函数相似,系统会实例化出推断出的形参类型对应的函数

模版函数可以是内联inline(加在template的下一行)的,模版定义不会生成代码,只会在调用函数模版时,才会实例化出一个特定版本的函数。

非类型模版参数

传统的类型名来指定非类型参数,当模版被实例化时,这些非类型模版参数的值必须是常量表达式,在编译时实例化。

template<int a, int b>
int func()
{
   
	int result = a + b;
	return result;
}
int answer = func<12, 13>();	//显式的指定模版参数--在尖括号中提供额外的信息

02 类模版概念、类模版定义、使用

1 概述
2 类模版定义
3 类模版的成员函数
4 模版类名字的使用
5 非类型模版参数

概述

用类模版实例化一个特定的类,需要在模版名后用<>提供额外的信息。实例化类模版需要包含全部信息,包括类成员函数的定义

类模版定义
template <typename 形参名1, typename 形参名2, ..., typename 形参名n>
class 类名
{
   
	...
};
template<typename T>
class myvector
{
   
public:
	typedef T* myiterator;
public:
	myiterator mybegin();	//返回值是myiterator,其实就是指向容器内部对象的指针
	myiterator myend();
	void func();
	
	myvector& operator=(const myvector&);
};
类模版的成员函数
  • 类模版的成员函数可以写在类定义中,这种成员函数会被隐式声明为inline函数
  • 类模版一旦被实例化之后,每个实例都会有自己版本的成员函数
  • 类模版的成员函数具有和这个类模版相同的模版参数
  • 定义在类模版之外的成员函数必须以template<模版参数表>开始,类名后要用<>把模版参数列表里的参数名列出
template<typename T>
void myvector<T>::func
{
   
	...
}

template<typename T>
myvector<T>& myvector<T>::operator=(const myvector&)
{
   
	return *this;
}
浮点型/类类型 不能做类模版的非类型模版参数

03 用typename场合、默认模版参数、趣味写法分析

1 typename的使用场合
2 函数指针做其他函数的参数
3 函数模版趣味用法举例
4 默认模版参数

typename的使用场合
类型成员
typedef T* iterator;

vector<int>::iterator iter;

这个typedef出的就是类型成员。

#include <vector>

vector<int> contain;
for (vector<int>::iterator iter = contain.begin(); iter != contain.end(); iter++) {
   }

这里的contain是一个类对象;iterator是实例化vector得到的类中的类型成员;iter是一个指向int对象的指针,因为typedef *T iterator,contain是一个储存整形数据的类对象,可以调用类成员函数begin(

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值