C++模板浅谈

本文深入探讨了C++中的模板概念,解释了为何模板比重载更具优势,以及如何使用模板来创建函数家族。此外,还提供了一个vector类的模板实现示例,展示了动态顺序表的高效管理和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,模板介绍

由来:在C语言中,每次使用数据结构的时候都得自己写一个,而且还不支持多个类型的使用,必须重新换一个类型适应要求。

所以C++就提出模板的概念,它要能支持多种类型的使用,而不是只能用一种类型,并且给你放在库里,你可以直接使用。

二,函数模板

1,为什么不用重载替代模板?

重载虽然可以实现多种类型的使用,但是重载复用性太低,每次有新的类型都需要重新加入。

代码维护性低,一个代码出错可能影响其他的重载。

2,函数模板概念 
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本

3.函数模板格式 
template<typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

4.模板参数实例化

隐式类型实例化:不告诉模板具体实例,让它自己去推导,但是不能有多个类型,编译器不知道该推成哪一个。

显示类型实例化:ADD(a,(int)b) 可以用这种方式,也可以显示给定 ADD<int> (a,b);

注意:如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

5,对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模 板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模版

6.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函 数

三,vector的简单模板实现


 
 
 
   
// 动态顺序表
 template<class T>
 class Vector 
{
 public :  
  Vector(size_t capacity = 10)  
      : _pData(new T[capacity])
       , _size(0) 
       , _capacity(capacity)  
  {}       
 // 使用析构函数演示:在类中声明,在类外定义。 
   ~Vector();    
    void PushBack(const T& data)  
  {       
  // _CheckCapacity();      
   _pData[_size++] = data;   
  }      
     void PopBack()    
 {       
 --_size; 
   }       

 size_t Size()   
 {       
 return _size;  
  }      
  T& operator[](size_t pos) 
   {        
           assert(pos < _size);    
            return _pData[pos];    
}   
 private:   
 T* _pData; 
   size_t _size;  
  size_t _capacity;
 };
 


template <class T> Vector<T>::~Vector()
 {   
 if(_pData) 
   {       
 delete[] _pData; 
   }
 }
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值