栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 泛型编程--模板(函数模板和类模板具体用法)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 泛型编程--模板(函数模板和类模板具体用法)

模板
c++提供两种模板机制:
    - 函数模板
    - 类模板

概念:模板就是建立通用模具,提高代码复用性
函数模板的基本语法 函数模板的作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体规定,
用一个虚拟的类型来表示。

语法:

template  //函数声名和定义

例:

#incldue
using namespace std;
//交换函数
template 
void MySwap(T &a , C &b)
{
    T c = a;
    a = (C)b;
    b = (T)c;
}
int main()
{
    int a = 1;
    char b= 'P';
    cout<(a,b) ------显示指定类型
    MySawp(a,b);
    cout< 
函数模板注意事项 
1、自动类型推导,必须推导出一致的数据类型
2、(显示指定类型)模板必须要确定出T的数据类型
普通函数和函数模板的区别
1、普通函数可以发生自动类型转换(隐式类型转换)
2、函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
3、如果利用显示指定类型的方式,可以发生隐式类型转换
普通函数和函数模板的调用规则
1、当函数模板和普通函数都可以实现(即同名-重载),优先调用普通函数
2、可以通过空模板参数列表来调用调用函数模板  `MySwap<>(a,b)---空模板 `
3、函数模板可以发生重载
4、如果韩式模板可以发生跟好的匹配结果优先调用函数模板
模板的局限性

有些特定的数据类型,需要用具体化的方式做特殊实现

#include
#include
using namespace std;

class Student
{
public:
    string name;
    int id;
    Student(string a, int b)
    {
        name = a;
        id = b;
    }
};

template
T Max_(T a, T b)
{
    if (a > b)
        return a;
    else
        return b;
}
//函数模板重载,具体化操作
template<> Student Max_(Student a, Student b)
{
    if (a.id > b.id)
        return a;
    else
        return b;
}
int main()
{
    Student A("张三",189891334);
    Student B("李四",132814195);
    cout << Max_(A, B).id << endl;
}
类模板 类模板的作用
建立一个通用类,类中的数据成员类型可以不作制定,用一个虚拟的数据类型表示。
语法
template  
类
类模板和函数模板区别
·类模板没有自动推导数据类型
·类模板的模板参数列表可以有默认参数
类模板和普通类区别
·普通类成员函数在一开始就创建
·模板类成员函数在调用阶段才创建
类模板对象作函数参数
·指定传入类型
·参数模板化
·整个类模板化
演示–类模板对象作函数参数
#include
#include
using namespace std;
//模板类
template
class A {
public:
    T name;
    TT id;

    A(T a, TT b)
    {
        name = a;
        id = b;
    }

    void Show_()
    {
        cout << "Name:" << name << endl;
        cout << "id:" << id << endl;
    }
};
//指定传如类型
void Print_1(A a)
{
    a.Show_();
}

void test_1()
{
    //类模板实例化对象
    AAA("张三",0001);
    Print_1(AA);
}
//参数模板化
template
void Print_2(A a)
{
    a.Show_();
}

void test_2()
{
    AAA("李四", 0002);
    Print_2(AA);
}
//整个类模板化
template
void Print_3(T a)
{
    a.Show_();
}
void test_3()
{
    AAA("王五", 0003);
    Print_3(AA);

}

int main()
{
    test_1();
    test_2();
    test_3();
}
类模板的继承
类模板继承注意一下几点
·当子类继承的父类是一个类模板时,子类在声明的时    候要指定出父类中T的类型
·如果不指定,编译器无法给子类分配内存
·如果像灵活的指定父类中的T类型,子类也需变成类模板
类模板成员函数类外实现

示例

#include
#include
using namespace std;
//模板类
template
class A {
public:
    T name;
    TT id;

    A(T a, TT b)
    void Show_()
   
};

//构造函数类外实现
template
A::A(T a,TT b)
{
        name = a;
        id = b;
}
//成员函数类外实现
emplate
void A::Show_()
{
    cout << "Name:" << name << endl;
    cout << "id:" << id << endl;
}
类模板的分文件编写 问题
类模板的成员函数的创建时机时调用阶段,会导致分文件编写时链接不到
模板类能否实例化创建特例,不仅仅需要模板的声明,而且还需要模板的定义,以及是否有模板的参数列表
解决方案、
--- cpp文件中直接包含他本身cpp文件C++中类模板分文件编写出现问题
解决方法:直接在main(使用他成员函数的文件)中包含.cpp 文件

---将声明和文件放到同一个文件中,并将后缀改成.hpp,.hpp是约定后缀    ,并不强制
类模板与友元
--- 类内实现,直接写
--- 类外实现  先做函数模板声明,下方在做函数模板定义,在做友元。如果声明了函数模板,可以将实现写到后边,否则要将实现体写到类前边让编译器提前看见
类外实现示例
##include
#include
using namespace std;

template
class A;

//因为他使用了A这个模板类,所以要让这个编译器知道这个模板类存在
template
void Show_(A P)
{
    cout << "Name:" << P.name << endl;
    cout << "id:" << P.id << endl;
}

//模板类
template
class A {
public:
    T name;
    TT id;

    A(T a, TT b)
    {
        name = a;
        id = b;
    }
    //加空模板参数列表<> 
    //如果该友元函数类外实现,需要编译其提前知道这个函数存在(因为这个函数已经变成了函数模板)
    friend void Show_<>(A P);
};


void Test_()
{
    A AA("李四",111);
    Show_(AA);
}
int main()
{
    Test_();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001915.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号