博主简介:
本博主是大二在读生,主要学习后端方向的知识。
博主的博客主页:CSND博客
Gitee主页:博主的Gitee
博主的稀土掘金:稀土掘金主页
博主的b站账号:程序员乐
c++中引进了泛型的概念,而引用泛型也是为了解决了C语言中对不同类型的参数需要实现多个不同参数的麻烦。
而泛型只是提供一个模板而已,对于不同的函数或者类会自动实例化相应的函数或者类。
模板分为
函数模板和类模板。
基本语法:
template,typename也可以换成class,而T可以随便改变,不叫T也是可以的。
template<typename T>
T Add(const T& a, const T& b)
{
return a + b;
}
当传的是
int参数的时候,会自动推演出T为int,并且实例化出该函数,而这些工作都是编译器为我们做的。
但是
有时候需要我们显示的显示出类型。比如传这样的参数
Add(1.1,2),那么编译器就无法推演出来。此时就需要我们显示的传入类型。Add,就是在函数名字的后面加上一个(1.1,2) <>,里面是显示传的类型。
当我们有显示类型的函数,还有一个模板参数的时候,那么会调用哪一个呢?结论是,当传入的参数是那个显示写的函数的时候,会调用显示写的,没有再去调用模板。
template<typename T>
T Add(const T& a, const T& b)
{
cout << "模板" << endl;
return a + b;
}
int Add(int& a, int& b)
{
cout << "非模板" << endl;
return a + b;
}
测试代码:
int x = 1, y = 2; Add(x, y);

注意:
有时候会失败,可能的原因是权限问题,比如权限的放大会报错。欢迎评论区讨论。这里就不放相应的代码了。虽然我已经遇到过了。
为什么引用模板上文已经说了,这里就不再叙述。
本博主觉得和函数模板差别不是很大,只不过要显示的写出类型。类型随意,可以是自定义类型也可以为内置类型。类模板的定义和声明是不可以分在两个文件中的。
这里演示一个栈的类吧!
template<class T>
class Stack
{
public:
Stack(size_t capacity=4)//构造函数
:_a(nullptr)
, _top(0)
, _capacity(0)
{
if (capacity > 0)
{
_a = new T[capacity];
_capacity = capacity;
}
}
void Push(T x)//插入
{
if (_top == _capacity)
{
int NewCapacity = _capacity == 0 ? 4 : _capacity * 4;
T* temp = new T[NewCapacity];
if (_capacity == 0)
{
_a = temp;
_capacity = NewCapacity;
}
else
{
memcpy(temp, _a, sizeof(T) * _capacity);
_a = temp;
_capacity = NewCapacity;
}
}
_a[_top] = x;
++_top;
}
void Pop()//删除
{
assert(_top > 0);
--_top;
}
~Stack()//析构
{
delete[] _a;
_a = nullptr;
_capacity = _top = 0;
}
private:
T* _a;
size_t _top;
size_t _capacity;
};
int main()
{
Stack<int> p1;//显示传入类型
Stack<int> p2(100);
return 0;
}