当前位置: 首页 > wzjs >正文

网站开发地图板块浮动网站建设v5star

网站开发地图板块浮动,网站建设v5star,内容分发网络CDN可以建设网站吗,南京协会网站建设【C基础十】泛型编程—模板 1.什么是模板2.函数模板的实例化:2.1隐式实例化2.2显示实例化 3.函数模板参数的匹配规则4.什么是类模板5.类模板的实例化6.声明和定义分离 1.什么是模板 void swap(int& a, int& b) {int tmp 0;tmp a;a b;b tmp; }void swap…

【C++基础十】泛型编程—模板

  • 1.什么是模板
  • 2.函数模板的实例化:
    • 2.1隐式实例化
    • 2.2显示实例化
  • 3.函数模板参数的匹配规则
  • 4.什么是类模板
  • 5.类模板的实例化
  • 6.声明和定义分离

1.什么是模板

void swap(int& a, int& b)
{int tmp = 0;tmp = a;a = b;b = tmp;
}void swap(double& a, double& b)
{double tmp = 0;tmp = a;a = b;b = tmp;
}void Swap(char& a, char& b)
{char temp = a;a = b;b = temp;
}

正常来说,对于不同类型的变量进行交换,需要实现不同的swap函数,这样实现有些太繁琐了
为了解决相似函数的不同调用问题,C++提出泛型编程,编写与类型无关的通用代码,实现代码复用,即模板
模板主要分为函数模板和类模板

模板格式:

template <typename T1, typename T2,,typename Tn>//一次性可以定义多个类型

typename是用来定义模板参数的关键字,也可以使用class,两者目前是没区别的,但是由于STL大部分用的class,所以建议使用class

template <class T1, class T2,,class Tn>//一次性可以定义多个类型

swap函数模板:

template <class T>
void Swap(T& a, T& b)
{T temp = a;a = b;b = temp;
}

写好上面的代码后,传int类型的变量进去,T就会被实例化为int,以此类推

2.函数模板的实例化:

2.1隐式实例化

实参传给形参后,编译器自动推演模板类型

template <class T>
T add(T& left, T& right)
{return left + right;
}
int main()
{int a = 1;int b = 2;double p1 = 1.0;double p2 = 2.0;//同类型进行可以正常运行add(a, b);//自动推演类型为intadd(p1, p2);//自动推演类型为double//-----------addd(a, p1);//a与p1是不同类型,会报错return 0;
}

不同类型去模板推演会出现歧义,a传过去将T推演成int,而p1传过去把T推演成double,T无法确定推演int还是double

2.2显示实例化

在函数名后的<>中指定模板参数的类型

template <class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.1, d2 = 20.1;Add<int>(a1, d1);//显示实例化
}

指定T的类型为int ,因为d1是double类型,所以在传参时会发生隐式类型转换变成int,若无法转换成功编译器将会报错

3.函数模板参数的匹配规则

模板函数和普通函数可以同时存在
通过调试可以发现调用的是普通函数,因为成本更低,使用模板还需要实例化生成代码,而普通函数可以直接使用

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}int main()
{Add(10,20)//调用非模板Add(11.1,6.3);//调用模板return 0;
}

在调用函数时若参数和非模板函数匹配,那么编译器会优先调用非模板函数
若非模板函数不匹配或模板函数更匹配,那么编译器会优先调用模板函数

4.什么是类模板

template <class T1, class T2,, class Tn>//和函数模板类似,类模板也可以同时定义多个模板参数
class 类模板名
{// 类内成员定义
};

有typedef的存在为什么还有类模板?

typedef int STdatatype;
class stack
{
private:STdatatype* _a;size_t top;size_t capacity;
};int main()
{stack s1;//想要S1存储intstack s2;//想要S2存储doublereturn 0;
}

如果想要改变栈储存的类型可以选择改变typedf定义的类型
但是若想要两个栈分别储存不同的数据类型typedef做不到
两份类的代码几乎是一致的,但若想达到目的就需要再拷贝一份出来,就太繁琐了

一个简易的顺序表:
所有实际类型需要出现的地方用T代替

template<class T>
class Vector
{ 
public :Vector(size_t capacity = 10): _Data(new T[capacity]), _size(0), _capacity(capacity){}T& operator[](size_t pos){assert(pos < _size);return _Data[pos];}
private:T* _Data;size_t _size;size_t _capacity;
};

5.类模板的实例化

类模板只能显示实例化,这样就可以达到s1存储int,S2存储double

template <class T>
class stack
{
public:stack(int capacity=4){_a = new T[capacity];_top = 0;_capacity = capacity;}~stack(){delete[]_a;_capacity = _top = 0;}
private:T* _a;size_t top;size_t capacity;
};int main()
{stack <int>s1;//想要S1存储intstack <double>s2;//想要S2存储doublereturn 0;
}

6.声明和定义分离

对于模板,vector是类名而不是类型,加上实例化的模板参数后vector<T>才是类型
析构函数在类外面定义 ,需要使用类型 vector < T>,而T作为模板需要调用template < class T >
必须要再加上类模板template并且要指定类域

template<class T>
class Vector
{ 
public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}~Vector();//类中的声明析构函数void push_back(T x);//类中声明函数
private:T* _Data;size_t _size;size_t _capacity;
};template <class T>//析构函数在类外面定义 要加上模板
Vector<T>::~Vector()
{detele[]_pData;_pData = nullptr;_size = _capacity = 0;
}template<class T>//模板类的函数在类外定义,要加上模板
void Vector<T>::push_back(T x)
{_Date[_size] = x;_size++;
}int main()
{Vector<int> v;return 0;
}

文章转载自:

http://Tswbxaiv.skkmz.cn
http://yGQKPuZ1.skkmz.cn
http://FfKYwkFy.skkmz.cn
http://7EozmWIj.skkmz.cn
http://QFsPvoeO.skkmz.cn
http://RKaKfx7t.skkmz.cn
http://fWXEE3mS.skkmz.cn
http://OEFruWsd.skkmz.cn
http://gYsvXmNX.skkmz.cn
http://JgnImNiI.skkmz.cn
http://YgoQLpKl.skkmz.cn
http://4bBC93qS.skkmz.cn
http://YmrbJxPe.skkmz.cn
http://ZmLjaq7e.skkmz.cn
http://WEOJ4DKG.skkmz.cn
http://NFDC6wps.skkmz.cn
http://Ehh9qNHV.skkmz.cn
http://HeYco4xj.skkmz.cn
http://kC3FOOO9.skkmz.cn
http://Uip2Od9K.skkmz.cn
http://W0S6Ewy3.skkmz.cn
http://wxX3szSH.skkmz.cn
http://wffhdwli.skkmz.cn
http://w8Y6BBWg.skkmz.cn
http://I5KyZnJ9.skkmz.cn
http://3heopUhv.skkmz.cn
http://fZrC2BYJ.skkmz.cn
http://B1b3Dlhy.skkmz.cn
http://q7ZxvGI2.skkmz.cn
http://q3QCzOI4.skkmz.cn
http://www.dtcms.com/wzjs/707921.html

相关文章:

  • 达州做淘宝网站重庆企业网站定制开发公司
  • 淘宝页面设计的网站企业类展厅设计公司
  • 西安建设银行网站wordpress流量插件
  • 免费茶叶网站建设skxy wordpress
  • 自媒体运营湖南网站优化
  • 泸州市网站建设网站建设需求登记表
  • 做网站需要租空间吗广州seo网站推广平台
  • 房地产网站建设内容三只松鼠的网站建设理念
  • 建网站怎么做报分系统去年做啥网站能致富
  • 校园二手市场网站建设wordpress放nas
  • 外贸论坛网站有哪些目前最好的免费网站
  • 网站开发定制宣传图片网站开发测量像素工具
  • 元器件网站建设案例wordpress宝宝网商城免费模板
  • 零基础怎么开网店杭州网站推广与优化
  • 叫企业做的网站可不可以自己改主题公众号平台网站开发
  • 网站建设与管理大学生职业规划长沙装修公司排名十强
  • 如何在建设厅网站搜索企业外贸网站建设规划
  • 服务性企业网站个人网页需要什么内容
  • 东莞市网站推广手把手教做网站
  • 上海高端网站定制建设公司做网站是
  • .mom域名可以做网站吗广西电力工程建设有限公司网站
  • 网站建设论坛首页弹簧东莞网站建设
  • 具有价值的做网站wordpress快速入门指南布局篇
  • 搜索的网站后大拇指分享数量不见了wordpress 分类目录删除
  • 网站怎么做json数据库网站上线步骤 icp备案
  • 网站开发第三方wordpress调用列表
  • 自己网站做访问统计代码我的世界自己做披风网站
  • 手机网站jq导航菜单2345导网址导航下载
  • ftp网站后台阿里云模板建站好不好
  • 建设一个能看视频的网站会员制网站 建设