• c++模板


    博主简介
    本博主是大二在读生,主要学习后端方向的知识。
    博主的博客主页CSND博客
    Gitee主页博主的Gitee
    博主的稀土掘金稀土掘金主页
    博主的b站账号:程序员乐
    在这里插入图片描述



    泛型

    c++中引进了泛型的概念,而引用泛型也是为了解决了C语言中对不同类型的参数需要实现多个不同参数的麻烦。
    而泛型只是提供一个模板而已,对于不同的函数或者类会自动实例化相应的函数或者类。

    模板

    模板分为函数模板类模板

    函数模板

    基本语法:
    templatetypename也可以换成class,而T可以随便改变,不叫T也是可以的。

    • 对于c语言的函数,我们需要写不同类型的参数。即使c++中引入了函数重载,也是需要写多个重载函数。而模板的出现解决了这个问题。
      下面就演示一下:
    template<typename T>
    T Add(const T& a, const T& b)
    {
    	return a + b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当传的是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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试代码:
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    服了,一个ThreadLocal被问出了花
    UGUI交互组件ScrollView
    解决Antd 二次封装表格的可编辑功能(editable table)不生效的问题
    c语言基础程序——经典100道实例。
    深度神经网络之BiseNet
    SpringBoot简单整理
    日志收集分析平台项目-2-项目原理
    vulnhub靶机ha:wordy
    WebGL 雾化
    uni-app 使用 webview运行到小程序,打开萤石云视频
  • 原文地址:https://blog.csdn.net/m0_60598323/article/details/127137613