• c++函数模板与类模板


    1 模板介绍

    • 模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者公式。

    2 函数模板

    2.1 函数模板的实现

    • 函数模板形式
    template <类型形参表>
    类型 函数名(形参表){
    	函数体
    }
    
    • 1
    • 2
    • 3
    • 4
    • 类型形参表的形式为:template T1, tempplate T2, …, template Tn或者class T1,class T2,…,class Tn
    • 测试代码
    #include 
    
    template 
    T myAddFunc(T data1, T data2) {
    	return data1 + data2;
    }
    
    int main() {
    	int iSum = myAddFunc(100, 50);
    	float fSum = myAddFunc(3.6, 8.8);
    
    	std::cout << "iSum = " << iSum << std::endl;
    	std::cout << "fSum = " << fSum << std::endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 执行结果
    iSum = 150
    fSum = 12.4
    
    • 1
    • 2

    2.2 函数模板实现原理

    • 当我们调用一个函数模板时,编译器通常用函数实参来为我们推断模板实参。即当我们调用myAddFunc时,编译器使用实参的类型来确定绑定到模板参数T的类型。
    • 例如我们调用myAddFunc(100, 50)时,实参类型为int,编译器会推断出模板实参为int,并将它绑定到模板参数T
    • 编译器用推断出的模板参数来为我们实例化一个特定版本的函数。

    2.3 函数模板重载

    • 函数模板可以像普通函数一样重载
    • 测试程序
    #include 
    
    template 
    T myAddFunc(T data1, T data2) {
    	return data1 + data2;
    }
    
    template 
    T myAddFunc(T data1, T data2, T data3) {
    	return data1 + data2 + data3;
    }
    
    int main() {
    	int sum1 = myAddFunc(10, 20);
    	int sum2 = myAddFunc(10, 20, 30);
    
    	std::cout << "sum1 = " << sum1 << std::endl;
    	std::cout << "sum2 = " << sum2 << std::endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3 类模板

    • 类模板实际上是函数模板的推广。类模板用于实现所需数据的类型参数化

    3.1 类模板的声明与定义

    template <类型形参表>
    class 类名{
    	//类成员
    };
    
    template <类型形参表>
    返回类型 类型<类型名>::成员函数1(形参表){
    	//函数体
    }
    
    template <类型形参表>
    返回类型 类型<类型名>::成员函数n(形参表){
    	//函数体
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 模板类声明与定义
    template 
    
    class MyArray
    {
    public:
    	MyArray(int size);
    	~MyArray();
    
    	T& get(int index);
    	void set(int index, T value);
    
    private:
    	int mSize;
    	T *mData;
    };
    
    template 
    void MyArray::set(int index, T value) {
    	mData[index] = value;
    }
    
    template 
    MyArray::MyArray(int size)
    {
    	mSize = (size > 1) ? size : 1;
    	mData = new T[mSize];
    }
    
    template 
    MyArray::~MyArray()
    {
    	delete[]mData;
    }
    
    template 
    T& MyArray::get(int index) {
    	return mData[index];
    }
    
    • 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
    • 这里要注意下,类模板的定义和实现都要放在头文件中。
    • 调用
    #include 
    #include "MyArray.h"
    
    int main() {
    	MyArray intArray(10);
    
    	intArray.set(0, 12);
    	intArray.set(1, 24);
    	intArray.set(2, 34);
    	intArray.set(3, 55);
    
    	std::cout << "intArray[0] = " << intArray.get(0) << std::endl;
    	std::cout << "intArray[1] = " << intArray.get(1) << std::endl;
    	std::cout << "intArray[2] = " << intArray.get(2) << std::endl;
    	std::cout << "intArray[3] = " << intArray.get(3) << std::endl;
    
    	MyArray floatArray(10);
    	floatArray.set(0, 1.1);
    	floatArray.set(1, 19.5);
    	floatArray.set(2, 20.0);
    	floatArray.set(3, 8.8);
    
    	std::cout << "floatArray[0] = " << floatArray.get(0) << std::endl;
    	std::cout << "floatArray[1] = " << floatArray.get(1) << std::endl;
    	std::cout << "floatArray[2] = " << floatArray.get(2) << std::endl;
    	std::cout << "floatArray[3] = " << floatArray.get(3) << std::endl;
    
    	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
  • 相关阅读:
    Linux认识协议
    VMware Workstation 与 Device/Credential Guard 不兼容问题
    CentOS7设置 redis 开机自启动
    SpringBoot Servlet容器启动解析
    积分商城游戏设置的基本要点
    Hadoop生态圈中的Flume数据日志采集工具
    可视化业务流程监控,是解决方案更是运维之道!
    数据结构与算法之顺序表经典题目《合并两个有序数组》《合并两个有序链表》
    2019年初Java开发面试经验(南京)
    css吸顶特效(elementui vue3官网)
  • 原文地址:https://blog.csdn.net/new9232/article/details/127816792