c++之模板初阶

c++之模板初阶_第1张图片

博客:小怡同学
个人简介:编程小萌新
如果博客对大家有用的话,请点赞关注再收藏

泛型模板

函数重载的缺点

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函 数
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错
    //
    为了提高效率,编译器生成一个模板根据不同的类型来生成代码
    泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
    模板分为 类模板 和 函数模板

类模板

书写模式:template 或者 template

类模板的实例化

1.需要每个函数模板之前都带有 template
或者 template
2.分为隐式实例化和显式实例化, //显式实例化就是调用时 函数名之后指定参数
//例 Swap(T);
3.显式实例化使用场景:编译推导不出参数类型就需要显式实例化
4.类型转化需要用const来接收

#include 
using namespace std;

template <class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}


//显示实例化的场景
template <typename T>
T*  Func(int n)
{
	return new T[n];
}


//类型转化会产生临时变量用const接收
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}

int main()
{
	int a = 0;
	int b = 1;
	//隐式实例化
	Swap(a,b);
	double c = 0.0;
	double d = 1.1;
	Swap(c, d);
    //显示实例化,编译器推导不出参数类型
     Func<double>(10);
    //当参数类型不同时(这里也是显示实例化)
	Swap<int>(a,c);

    //类型转化会产生临时变量用const接收
	T Add<double>(a,b);
	
}


模板参数的匹配原则

1.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模 板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
2.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

类模板

类模板一般用于显式实例化

类的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

template <typename T>
class	Queuenode
{
public:
	T x;
	Queuenode<T>* next;
};

template <typename T>
class Queue
{
public:
	Queue();
	~Queue();
	Queue(Queue<T> const &q);
};


//这里注意 template每个函数或类之前需要写上
template <typename T>
Queue<T>:: Queue()//这里 类型指定函数
{
	//.........
}

c++之模板初阶_第2张图片

你可能感兴趣的:(c++,开发语言)