模版初阶(模版)

目录

模版堆c++的重要性

泛型编程

函数模版

函数模板的格式:

函数模版的原理:

函数模版的实例化:

模版参数的匹配使用

类模板:

模版的定义和声明:

类模板和函数模板的区别:

补充:

模版堆c++的重要性

其实在函数重载里面可以解决这个问题,但是我们却可以使用c++发明出的模板,这个博班让c++一跃成为世界上面最好的语言之一

泛型编程

泛型编程就是编写与类型无用的通用代码,是代码复用的一种体现,模版是泛型编程的基础

这里面我们主要去学模版函数和类模板

函数模版

模版函数代表了一个函数家族,该函数模板与类型无关,在使用过的时候被参数化,编译器根据实参的类型去推断

函数模板的格式:

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}

int Add(const int& x, const int& y)
{
	return (x + y) * 10;
}

int main()
{
	cout << Add(10, 20) << endl;
	return 0;
}

这里面用class或者typename都可以

函数模版的原理:

函数模版是一个蓝图,它本身不是函数,和活体印刷差不多

c++中用swap的库,有多个模版参数就可以使用不用的类型

template<typename T>
void swap(T& a,T& b)
{
T temp = a;
a = b;
b= temp;
}

在编译器的编译阶段,编译器需要根据传入的实参类型来推演生成对应的类型的函数来供调用,当时利用double类型来时用函数模版时候,编辑器通对实参的推演,将T确定为double的类型,然后产生一个专门处理double类型的代码

函数模版的实例化:

这里面的实例化有两种:1.隐式实例化  2 .显示实例化

显示实例化:  可以解决不用类型相加的问题

在c语言里面想要不同类型的转换,我们一般只有强制类型转换

不同类型的参数使用函数模板的时候就是函数模版的实例化

Add(a,(int)d);//推导实例化

Add<int>(a,b);//显示实例化

模版参数的匹配使用

一个非模版函数可以和一个同名的函数模版同时存在,而且该函数模版还可以被实例化为这个非模版的函数。

隐式类型的转化:主要在整形之间各种的转化,当然浮点数和整形之间都是可以的

特点:

1.对于非模版函数和同名的函数模版,如果其他的条件都是相同的话,在调用的时候会先调用非模版函数而不是先去从该模版里面创建一个实例。但是如果模版可以产生提个具有更好匹配的函数,那么回去选择模版函数

2.模版函数不允许自动类型转换,但是普通函数可以进行自动类型转换

类模板:

if空间如果不够的话,不能调用realloc去扩容,由于realloc的寇蓉不回去调用构造函数去初始化,所以从此以后我们都去手动扩容,这里面扩容有两种,一种是内存够用的话就是蹦迪扩容,如果内存不够的话就是异地扩容。

这里面就是一个例子

#include<iostream>
using namespace std;
template<class T>
class stack
{
public:
	stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = size;
	}
	~stack()
	{
		delete[] _array;
		_array = nullptr;
		_capacity = _size = 0;
	}

	//void push(const T& x);
	void push(const X& y)
	{
		if (_capacity == _size)
		{
			X* tmp = new X[_capacity * 2];
			memcpy(tmp, _array, sizeof(X) * size);
			delete[] _array;
			_array = tmp;
			_capacity *= 2;
		}
		_array[_size++] = y;
	}
private:
	T* _array;
	size_t _size;
	size_t  _capacity;
};

模版的定义和声明:

模版不建议定义和声明分离到两个文件.h和.cpp里面,不然会出现连接的错误,具体原因我现在也不知道,后面会将,可以在评论区去at我问一下

如果你想这一千学的typedef就可以了,那可就太小看我们的c++了,如果你想去穿件一盒int和double类型的话,那么就要去拷贝2份了,这样的会很麻烦。

类模板和函数模板的区别:

类模板和函数模板有一些区别,类的模版实例化需要我们再模版名字后面加上<>,然后将实例化的类型放在<>里面,类模板名字不是真正的类,而实例化后的结果才是真正的类

不同类型实例化后产生的类不是用一个类

补充:

只有new出来的才需要delete

set容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值