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

网站建设的网络做网站每年交服务费

网站建设的网络,做网站每年交服务费,汕头免费自助建站模板,公司内部网站设计文章目录 前言一.泛型编程 函数模板 模板参数的匹配原则 类模板总结前言 ADD函数很好写,但是如果我们要有int类型的,double类型的,char类型的等等各种类型,难道要写这么多不同的ADD函数吗,这么写简直太麻…

 

 

文章目录

  • 前言
  • 一.泛型编程
  •      函数模板
  •      模板参数的匹配原则
  •      类模板
  • 总结

 


前言

ADD函数很好写,但是如果我们要有int类型的,double类型的,char类型的等等各种类型,难道要写这么多不同的ADD函数吗,这么写简直太麻烦了,所以有了泛型编程的概念。


 

一、泛型编程

实现一个通用的ADD函数有很多办法,就比如函数重载,但是函数重载又有很多的缺点,比如:

1.重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。

2.代码的可维护性比较低,一个出错可能所有的重载都出错。

那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生产代码呢?

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

函数模板

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

函数模板格式:

template<typename p1,typename p2........>

注意:typename用来定义模板参数关键字也可以使用class(切记:不能使用struct代替class)
template <class T>
void Swap(T& d1, T& d2)
{T tmp = d1;d1 = d2;d2 = tmp;
}
int main()
{int a = 10, b = 50;Swap(a, b);double c = 2.36, d = 6.15;Swap(c, d);return 0;
}

3b40aac6911a4438bf22fb7ba793e11c.png

那么上图中的两次调用Swap函数是同一个函数吗?这里不是同一个函数,我们先来验证一下:

2a078b1112d14e37b9b44383c42af471.png f3a3c429bf594036a65ca23a55f30a33.png

 通过汇编代码我们发现两个函数并不是同一个,他们有着不同的地址。这是因为模板就像是印刷的模具一样,生成的函数就是印刷出来的书,我们看的是书并不是印刷的板,每本书用的印刷的板都是一样的但是书中的内容是不一样的。

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模 板就是将本来应该我们做的重复的事情交给了编译器。

 e10acf4bb36241c9b20e04ae82d91700.png

 下面我们来看一些关于模板的小细节:

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.22, d2 = 20.32;cout << Add(a1, a2) << endl;cout << Add(d1, d2) << endl;return 0;
}

首先上面的代码是可以正常编译的,那么如果写成下面这样呢?

6e2c58f90b304e4fa0c50c06917a0a23.png

这里有两种解决方式,一种是强制类型转换,一种是显式实例化。

int main()
{int a1 = 10, a2 = 20;double d1 = 10.22, d2 = 20.32;//实参传递给形参,自动推演模板类型cout << Add(a1, (int)d1) << endl;cout << Add(d1, d2) << endl;//显示实例化cout << Add<int>(a1, d2) << endl;cout << Add<double>(a1, d1) << endl;return 0;
}

ebf3f3fbd892496faaa16a9d6b77c830.png

 在函数名后加<(需要的类型)>就可以完成显式实例化,编译器直接以显式的类型去计算。

模板参数的匹配原则

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}
void Test()
{Add(1, 2); // 与非模板函数匹配,编译器不需要特化Add<int>(1, 2); // 调用编译器特化的Add版本
}
int main()
{Test();return 0;
}

87d7c08fce4b43aeb6f5d2d9b3e91c6a.png

 我们可以看到上面代码中有两个Add函数,当他们类型都为int的时候为什么没有函数重定义呢?

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

586ed4cd9714418d81e70ccdb1c85a89.png

那么像上图这样的情况编译器会调用哪个呢?答案是第一个,因为对于非模板函数和同名函数模板,如果其他条件都相同,在调用时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的一个函数,那么将选择模板。

什么意思呢?就是说已经存在一个能用的函数了编译器就不会花时间去实例化一个相同的函数,而是调用那个已经存在的函数。

如果我们必须要调用那个模板有什么方法吗?

caced6abeec24b7f9107748a648f8010.png 我们直接在函数名后显示实例化就会调用模板了。

类模板 

template<class T>
class Stack
{
public:Stack(int capacity = 4){_a = new T[capacity];_top = 0;_capacity = capacity;}~Stack(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
paivate:T* _a;size_t _top;size_t _capacity;
};
int main()
{Stack<int> sl;Stack<double> st;return 0;
}

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

注意:模板的声明和定义分开与普通类不一样,如下图:

b832acdbfdc040a6bff91e7d6e533c99.png

9cb58e09c3074b2d85fc4be48a85c823.png 模板的声明和定义分离只限于在一个文件中,如果声明和定义在两个不同的文件会出现链接错误。

0472bfbf0be34f47922594518edffe59.png

模板的类创建对象必须显示实例化在类名后面加<>确定其类型。 

 


总结

模板的出现让我们在写一些代码相同但是类型不同的函数或者类的时候方便了很多,以前这些都是由我们自己写出来的,有了模板就可以由编译器去做这件事,并且编译器做的比我们更好,因为人写总是会出现一些粗心的错误,编译器却不会。

 

http://www.yayakq.cn/news/277948/

相关文章:

  • 邵阳网站建设蓝海基业做的网站好吗
  • 网站推广系统ae模板精品站
  • 做民宿推广都有哪些网站wordpress+小米商城主题
  • 特效炫酷的网站企业网站建站 优帮云
  • 寻找手机网站建设广州建设网站的公司
  • 石家庄哪里有网站建设如何侵入网站服务器
  • 网站备案icp备案百度搜索关键词查询
  • 网站建设百强企业免费网站推广怎么做
  • 自考免费自学网站广州网站建设建航科技公司
  • wordpress 网站模板免费代理加盟项目
  • 龙岩网站设计找哪家好iis网站子目录设置二级域名
  • 网站是通过超链接中国建设银行舟山分行网站
  • wordpress如何上线莱州网站建设关键字排名优化网络托管微信代运营
  • 商城型网站怎么做优化wordpress 修改点击数
  • 上海商城网站开发wordpress怎么建app
  • 胶州网站建设培训哪家做网站做得好
  • 做百科的网站百度pc端网页版
  • 网站建设与维护的案例互联网推广电话销售话术
  • 网站开发和推广的不同北京营销型网站推广
  • 电子商务与网站建设课程网站开发 activex
  • 重庆李健做网站做网站前期框架图
  • 网站建设几点关门江苏建设信息电子证书
  • 长沙教育类网站建设建筑施工特种证书查询
  • 做网站不能有中文字符必应网站首页的图片怎么做的
  • 站长工具无忧简单的网页设计代码记事本
  • 长沙好的网站优化品牌北京的外包公司有哪些
  • 珠海哪个公司做网站好网络营销的主要手段和策略
  • 网站的思维导图怎么做公司官网怎么弄
  • 自发购卡网站在吗做wordpress下边音乐
  • html5网站后台页面设计城市分站cms