C++中的模板

本文探讨了C++中的模板特性,包括函数模板和类模板,旨在减少代码冗余。函数模板在运行时根据传入类型自动生成相应函数,而类模板则用于创建泛型类。通过示例代码,展示了如何使用模板实现函数和链表操作,帮助读者更好地理解和应用C++模板。
摘要由CSDN通过智能技术生成

        这段时间学习到了c++的领域,也有了很多感悟,碰到了很有意思的函数模板和类模板,接下来分享给大家。        

如下图所示,三个函数功能相同,只是类型不同,却要分别写成三个,非常的不方便。

模板:数据类型参数化

解决问题:减少逻辑冗余,只要用一个模板就可以代替多个函数

模板的分类:

函数模板:本质不是函数,不占内存空间的;只有在调用的时候才会根据你给的数据类型生成对应的函数(系统自动帮你生成的)。

函数模板格式:template<typename T>//typename也可以是class

               T 函数名(T 参数名,T参数名)

例:多个参数,且参数类型与返回值类型相同的函数定义
            template <typename T>
            T add( T a, T b) 
            {
                return a + b;
            }

下面代码是对函数模板的体现,大家可以通过代码理解。

#include <iostream>

using namespace std;

#include <string>

template<typename T, typename T1>

void printArry(T* arry, T1 size)

{                                

    int i = 0;

    for (i=0;i<size;i++)

    {

        cout << arry[i] << endl;

    }

}

template<typename T,int>

void printArry(T* arry, int size)

{

    int i = 0;

    for (i = 0; i < size; i++)

    {

 cout << arry[i] << endl;

    }

}

类模板与函数模板大同小异,不难理解。

类模板格式

template<类型参数表>

class 类模板名

{

        成员函数和成员变量

};

例:template <typename T>
            class A 
            {
            public : 
                A( T num)
                :m_TNum(num)
                {}
                ~A()
                {}
                void func( T data )
                {
                    m_TNum = data;
                }
            protected/private:
                T m_TNum;
            };
            
            int main()
            {
                A<int> a(3);
                a.func(5);
                return 0;
            }

类模板中的成员函数都函数模板!

 下面的代码是写的一个链表,体现了类模板。

#include <iostream>
using namespace std;
// 节点类
template<class T>
class Node
{
public:
    Node()
    {
        this->pnext = nullptr;
    }
    ~Node() {}
    T data;
    Node<T>* pnext;
};
//链表类
template<class T>
class Clist
{
public:
    Clist();
    ~Clist();
    void push_back(T data);//尾巴处插入
    void printNode();
    int getCount();
private:
    Node<T>* head;//链表头
    int count;//统计存入的数据有几分
};
template<class T>
Clist<T>::Clist()
{
    this->head = new Node<T>;
    this->count = 0;
}
template<class T>
Clist<T>::~Clist()
{
    delete this->head;
}
template<class T>
void Clist<T>::push_back(T data)
{
    Node<T>* ptemp = this->head;
    while (ptemp->pnext!=nullptr) 
    {
        ptemp = ptemp->pnext;
    }
    Node<T>* newNode = new Node<T>;
    newNode->data = data;
    // 
    ptemp->pnext = newNode;

    this->count++;


}//尾巴处插入
template<class T>
void Clist<T>::printNode()
{
    Node<T>* ptemp = this->head;
    while (ptemp->pnext != nullptr)
    {
        ptemp = ptemp->pnext;
        cout << ptemp->data << endl;
    }
}
template<class T>
int Clist<T>::getCount()
{
    return this->count;
}


int main()
{
    Clist<int> intList;
    intList.push_back(100); 
    intList.push_back(200);
    intList.push_back(300);
    intList.push_back(400);

    cout << intList.getCount() << endl;
    intList.printNode();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值