• C++:C++模板(函数模板与类模板的使用)


    函数模板与类模板

    作用: C++模板提供了一种通用模具,大大提高了代码的复用性,

    实现方式:将类型参数化

    模板分类:函数模板、类模板

    语法:

    (1)template关键字:表示要定义一个模板类型

    (2)typename关键字或class关键字: 表示给类型一个泛型名称.

    (3)<泛型名称>:放置在typename之后, 特指一种泛型类型,通常为大写.

    template

    一、函数模板:

    (1)函数内部对象的类型在调用函数时才确定(类型动态化)

    (2)在函数模板当中:

    template 只能表示以下一个函数是模板.

    template

    void fun1(T1 a)

    {

    }

    2函数模板使用:

    (1)自动类型推导:必须推导出一致的数据类型T,可以使用

    template

    void fun(T_ n1, T _n2)

    {

    Char  ch='1';

    intn=23;

    fun(n,ch);     //error

    }

    (2)显示指定类型,

    fun(n,ch);          //right!

    (3)注意:模板必须要确定出T的数据类型,才可以使用

    1)普通函数能够进行隐式类型转换:

    2)函数模板的自动类型推导,不能进行隐式转换

    调用规则:

    1.如果普通函数与函数模板都存在(一样),优先调用普通函数

    2.可以通过空模板参数列表来强制性调用模板函数,fun<>(a,b);

    3.函数模板可以发生重载

    4.如果函数模板可以产生更好的匹配,优先调用函数模板.

    普通函数需要类型转换时,函数模型只需要推导,则优先选择函数模板.

    1. #include
    2. using namespace std;
    3. int Myadd(int a,int b)
    4. {
    5. cout<<"普通函数"<
    6. return a+b;
    7. }
    8. template <class T>
    9. T Myadd(T a,T b)
    10. {
    11. cout<<"模板函数"<
    12. return a+b;
    13. }
    14. void test01()
    15. {
    16. int a=10;
    17. char b=20;
    18. Myadd(a,a); //调用普通函数不用推导
    19. Myadd<>(a,a);//调用模板函数
    20. Myadd<int>(a,a);//指定调用模板函数
    21. Myadd(a,b); //调用普通函数因为普通的函数可以自动类型转换
    22. //Myadd<>(a,b); //函数模板不会做自动类型转换
    23. }
    24. int main(int argc, char *argv[])
    25. {
    26. test01();
    27. return 0;
    28. }

    二、类模板

    ●类模板表示将类中的成员属性模板化(泛型化

    ●语法:

    template

    {

    class Person

    public:

    T1_ attri1 ;

    T2_ attri2;

    };

    ●注意:

    类模板实例化对象时没有自动推导类型方式,所以必须显示类型

    1 Person, int> p1;

    ●类模板中的泛型类型可以有默认参数,(函数模板也可以有,意义不大,因为有自动推导)

    template , typename T2=int>

    class Person

    {

    pub1ic:

    T1_attri1;

    T2_ attri2;

    };

    ●类模板成员函数类外实现:

     template ,typename T2=int>

    class A

    {

    Public:

    A();

    };

    template

    typename T2>

    A,T2>: :A()

    {

    }

    注意:类外实现的成员函数,模板不能有默认参数.

    ●类模板对象作为函数参数:

    1.指定传入类型(用的比较多)

    void fun(Data, int> &d)

    {

    }

    2.参数模板化

    template ,typename T2:

    void fun(Data, T2> &d)

    {

    }

    template

    void fun(T &d)

    }

    ●类模板与继承:

    。当子类继承的父类是一个类模板时,子类在声明的时候,要指定父类中的类型

    。如果要灵活指定父类中的T类型,子类也需要实现为类模板.

    template

    class Base

    {

    public:

    T num;

    };

    class Son: pub1ic Base

    public:

    string name;

    };

    template,typename T2>

    class Son1: public Base

    {

    pub1ic:

    T2 id;

    };

    int main()

    {

    Son1,char>s1;

    }

  • 相关阅读:
    C# 第五章『面向对象』◆第6节:类的继承
    kube-scheduler 抢占机制
    recycleView自定义ItemDecoration解决列表第一个item和最后一个item的间距难统一问题
    HTML爱心照片墙源码
    git使用
    全面指南:如何发布自己的npm插件包
    DRF-认证权限频率
    华为HCIP认证用处大吗?
    Docker的安装配置与使用
    07|声学回声消除AEC(1)
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126823470