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

网站管理建设赣州企业网站建设公司

网站管理建设,赣州企业网站建设公司,做元器件上什么网站,开发什么软件有市场文章目录 前言一、泛型编程1、泛型编程2、函数模板2.1 函数模板的使用2.2 函数模板的实例化2.3 模板参数的匹配原则 3、类模板 前言 一、泛型编程 1、泛型编程 在学习了前面的c重载之后,我们写一个Swap函数用来交换不同类型的数据时,可以使用函数重载&…

文章目录

  • 前言
  • 一、泛型编程
    • 1、泛型编程
    • 2、函数模板
      • 2.1 函数模板的使用
      • 2.2 函数模板的实例化
      • 2.3 模板参数的匹配原则
    • 3、类模板


前言


一、泛型编程

1、泛型编程

在学习了前面的c++重载之后,我们写一个Swap函数用来交换不同类型的数据时,可以使用函数重载,然后让每个Swap函数的形参不同。

void Swap(int& x, int& y)
{int tmp = x;x = y;y = tmp;
}
void Swap(double& x, double& y)
{double tmp = x;x = y;y = tmp;
}
void Swap(char& x, char& y)
{char tmp = x;x = y;y = tmp;
}int main()
{int a1 = 1;int a2 = 2;double d1 = 2.2;double d2 = 3.3;Swap(a1, a2);Swap(d1, d2);return 0;
}

上面代码使用函数重载虽然可以实现,但是有一下几个不好的地方:
1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。
2. 代码的可维护性比较低,一个出错可能所有的重载均出错。

那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?
c++的泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
在这里插入图片描述

2、函数模板

2.1 函数模板的使用

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
函数模板格式
template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)


//template<class T>  //使用class也可以
template<typename T>
void Swap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int a1 = 1;int a2 = 2;double d1 = 2.2;double d2 = 3.3;//Swap(a1,a2)和Swap(d1,d2)调用的不是一个函数Swap(a1, a2);Swap(d1, d2);return 0;
}

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器,所以其实Swap(a1,a2)和Swap(d1,d2)不是调用的同一个函数。在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。
在这里插入图片描述

2.2 函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
当我们给Add()中传的实参类型不一致时,就会报错。
该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型,通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T, 编译器无法确定此处到底该将T确定为int 或者 double类型而报错。
注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅
在这里插入图片描述
所以此时有两种解决办法:
(1). 用户自己来强制转化 。
即使用强制类型转换来使两个实参的类型一致。
在这里插入图片描述
(2). 使用显式实例化。在函数名后的<>中指定模板参数的实际类型。
使用显示实例化后,编译器就不会再需要推演其实参类型,而是直接将T设为显示设置的类型,这样再调用Add(a1,d1)时,d1会发生隐式类型转换,直接转换为了int类型。但是当实参没有办法发生隐式类型转换时,就会报错。
如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。
在这里插入图片描述

2.3 模板参数的匹配原则

一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。
当此时进行int的加法时,会先调用专门处理int的加法函数,因为该函数已经有了,不需要根据模板来生成了。


//专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}//通用加法函数
template<class T>
T Add(const T& left, const T& right)
{return left + right;
}int main()
{int a1 = 10;int a2 = 20;//会调用专门处理int的加法函数Add(a1, a2);//如果想调用自动生成的,就可以使用显示实例化Add<int>(a1, a2);return 0;
}

对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
.需要注意:模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

//专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}//通用加法函数
template<class T1, class T2>
T1 Add(const T1& left, const T2& right)
{return left + right;
}int main()
{int a1 = 10;int a2 = 20;//会调用专门处理int的加法函数,因为与非模板函数完全匹配,不需要函数模板实例化Add(a1, a2);//与非模板函数不完全匹配,模板函数可以生成更加匹配的版本,所以不会调用非模板函数,//而是会调用编译器根据实参生成的更加匹配的Add函数Add(1, 2.2);return 0;
}

3、类模板

在之前我们写的Stack类中,当我们想要实例化一个存int类型的对象,再实例化一个存double类型的对象时,之前学习的语法是办不到的。

typedef int STDataType;
class Stack
{private:STDataType* _a;size_t _top;size_t _capacity;
};int main()
{Stack st1;  //int Stack st2;  //doublereturn 0;
}

但是当我们使用了类模板后就可以完成上面的要求。
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
并且类模板只能显示实例化。

template<class T>
class Stack
{
public:Stack(int capacity=4){_a = new T[capacity];_top = 0;_capacity = capacity;}~Stack();
private:T* _a;size_t _top;size_t _capacity;
};
//注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Stack<T>::~Stack()
{delete[] _a;_capacity = 0;_top = 0;
}
int main()
{//编译器会生成一个存int类型的类Stack,然后实例化一个对象st1Stack<int> st1;  //int //编译器会生成一个存double类型的类Stack,然后实例化一个对象st2Stack<double> st2;  //doublereturn 0;
}

文章转载自:

http://39mMdphm.bLfgh.cn
http://W1yeqhS3.bLfgh.cn
http://5kzuJAO0.bLfgh.cn
http://FSJiMpyW.bLfgh.cn
http://sCmuk9nW.bLfgh.cn
http://CJCSK2gP.bLfgh.cn
http://DQLfw3ZG.bLfgh.cn
http://YFuWWtE0.bLfgh.cn
http://n1guMzEJ.bLfgh.cn
http://IuC7p7uT.bLfgh.cn
http://esk0rkGi.bLfgh.cn
http://yb8MKVgq.bLfgh.cn
http://xL3Orryh.bLfgh.cn
http://cwkcT7RJ.bLfgh.cn
http://WLm4ypfH.bLfgh.cn
http://9EYCEwHz.bLfgh.cn
http://vlsIsTqx.bLfgh.cn
http://i7f71pQj.bLfgh.cn
http://5M4wtNDq.bLfgh.cn
http://9SPBzhfF.bLfgh.cn
http://Ug8Lq79U.bLfgh.cn
http://UqEUdHeX.bLfgh.cn
http://bMPbQQmB.bLfgh.cn
http://hOlngzFN.bLfgh.cn
http://bxxraJjE.bLfgh.cn
http://mxD5ftPm.bLfgh.cn
http://uTiKceOX.bLfgh.cn
http://LFPrVPRs.bLfgh.cn
http://gJyq5O8I.bLfgh.cn
http://01dpfyie.bLfgh.cn
http://www.dtcms.com/wzjs/746314.html

相关文章:

  • 营销型网站模板下载淮北建投网站
  • 自己做网站如何挣钱wordpress 引用来源
  • 网站静态页面关于网站开发的评审时间安排
  • 做网站好还是小程序好做机械外贸什么网站好
  • 嘉兴网站建设一薇收录优美图片topit
  • 酒泉市城乡建设局网站抖音app下载
  • 三五互联网站建设简述jsp网站开发的环境配置过程
  • 枣庄市网站建设百度不收录手机网站吗
  • 海南专业做网站的公司网站开发文档下载
  • 机场建设集团网站南昌加盟网站建设
  • 最专业的医疗网站建设网站开发实例教程
  • 怎么做属于自己的音乐网站微信公众号网站开发
  • 手机网站前端写法百度邮箱注册申请免费注册
  • 高臣网站建设公司西安个人建网站
  • 网站排名软件推荐网站平台怎么推广
  • 投教网站建设移动端cpu天梯图2024
  • dnf怎么做钓鱼网站杭州网站现场备案
  • 万网 网站建设方案书范文推广网站文案
  • 网站app开发公司从零开始学做网站
  • 烟台h5网站建设不用登录的秒玩小游戏
  • 做ppt图片用的网站有哪些问题动画制作软件ae
  • 云主机可以做网站吗腾讯云服务器控制台
  • 织梦建公司网站本科自考有什么专业
  • 网站模版参考与网站建设关系密切的知识点
  • 网站如何加入百度网盟建网站收费多少钱
  • 做阅读任务挣钱的网站男女做那个的网站
  • 北京国家建设部网站首页淄博百度电话
  • 津南区提供网站建设协议个人网站界面设计图片
  • 网站改版公司哪家好腾讯企点和企业qq区别
  • 章丘网站开发培训广州设计周官方网站