引言
C语言与C++其中有一个很大的不同点,就是C++中引出了模版这个概念,节省了许多重复代码的书写,这篇文章将为你初步介绍模版
1. 模版
- 1.1. 模版意义
本质上是一种泛型编程,编写与类型无关的通用代码
- 1.2. 类型
1. 函数模版
2. 类模版
2. 函数模版
- 2.1 格式
这里先给一个加法的例子,然后再详细讲解
temoplate<class A>
A Add(A a, A b)
{
return a + b;
}
首先来解析第一行,template相当于一个关键字,是模版的核心,后接的“<class A>”,这里的A则是一个模版类型,会根据不同情况自动实例化为相对应的类型,“<>”中也可以写多种类型,如“<class A, class B, class C>”都是可以的,还需注意的是class可以换成typename
我们再看第二行,A就作为Add函数返回的类型,参数也是A类型,其他的按照正常函数的写法写就好了
- 2.2 模版实例化
模版实例化分为隐式实例化和显式实例化
1. 隐式实例化
指的是编译器根据情况自动推导类型,这里给出一个例子:
temoplate<class A>
A Add(A a, A b)
{
return a + b;
}
void test()
{
int a = 0;
int b = 1;
int c = Add(a, b);
}
这里Add函数将会自动推导A类型为int类型
2. 显式实例化
指的是我们强制规定了模版中的类型,具体使用方法如下
temoplate<class A>
A Add(A a, A b)
{
return a + b;
}
void test()
{
int a = 0;
int b = 1;
int c = Add<int>(a, b);
}
与隐式实例化不同的是,Add后加上了<int>,这样就规定了Add中A的类型为int,如果有多个类型就多写多个
- 2.3 模版与重载函数同时存在
当出现这种情况时,会优先走符合条件的函数,这里给出一个例子:
temoplate<class A>
A Add(A a, A b)
{
return a + b;
}
int Add(int a, int b)
{
return a + b;
}
void test()
{
int a = 0;
int b = 1;
int c = Add(a, b);
}
这里的Add函数将调用第二个,因为这里符合int类型,不需要编译器再进行推导,因此将会直接调用已存在的重载函数
3. 类模版
- 3.1 格式
与函数模版相同,这里先给出一个例子,再进行解析
tempalate<class A>
class List
{
typedef List<A> List;
private:
A _key;
List* _next;
List* _prev;
}
这里的第一行不作过多解释,与函数模版相同,接着在类的内部,就可以将A看作一个类型进行使用,其他也没什么特别的
- 3.2 特点
1.类模版都需要显式实例化,不能隐式实例化,就如例子中一般“List<A> List”,在正常使用中也需要这样,就像这样写:List<int> l
2.类模版中的模版函数不可以将声明和定义分离在不同的.h和.cpp文件中,这样会造成链接错误,编译器会报错
3.按需实例化
指的是如果没有调用到类模版中的函数,只要函数没有大错误都不会报错,所以我们一定要在写完函数后去调用测试一下,以防埋下大隐患
总结
模版初阶的内容虽然没有多少,但是模版确实C++十分重要的部分,大家一定要熟练掌握

评论(0)
暂无评论