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

要做未来科技的网站怎么做关键词搜索量查询

要做未来科技的网站怎么做,关键词搜索量查询,商业网站建设常识,衡阳网站建设公司目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值,针对不同类型,我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…

 目录

一、函数模板

1、概念

2、格式

3、实例化

4、模板参数的匹配 

二、类模板

1、定义格式

2、实例化


交换两个变量的值,针对不同类型,我们可以使用函数重载实现。
void Swap(double& left, double& right)
{double tmp = left;left = right;right = tmp;
}
void Swap(int& left, int& right)
{int tmp = left;left = right;right = tmp;
}
使用函数重载虽然可以实现,但是有一下几个不好的地方:
  • 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。
  • 代码的可维护性比较低,一个出错可能所有的重载均出错。

C++中提供了一种新的方式——泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

一、函数模板

1、概念

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

2、格式

template<typename T1, typename T2,......,typename Tn>

返回值类型 函数名(参数列表){ },typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)。

交换变量值的函数使用函数模板如下:

template<class T>
void Swap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}

简化过程的模板实际上是编译器帮我们处理了复杂的过程。

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

 

 定义多个模板数:

template<class A,class B>
void Fun{}

其实库里包含了swap函数,我们以后可以直接用。

int main()
{int a = 1, b = 2;swap(a, b);double c = 1.1, d = 2.22;swap(a, b);return 0;
}

3、实例化

函数模板的实例化是指根据函数模板创建具体的函数实例,实例化函数模板的过程是将函数模板中的类型参数替换为实际的类型,并生成对应的函数定义。这样就可以根据不同的类型参数创建多个函数实例,每个实例都可以处理相应类型的数据。

模板参数实例化分为:隐式实例化和显式实例化
template<class T>
T Add(const T& left, const T& right)
{return left + right;
}int main()
{int a1 = 10, a2 = 20;double d1 = 10.11, d2 = 20.22;Add(a1, a2);Add(d1, d2);Add(a1, d1);return 0;
}

前两个相同类型可以正常编译,但模板参数类型不同时编译出现错误。

这时因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T, 编译器无法确定此处到底该将T确定为int 或者 double类型而报错,在模板中,编译器一般不会进行类型转换操作。

我们可以选择强制类型转换解决,或者显示实例化。

 方法一:显式类型转换,实参传递给形参,自动推演模板类型。

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}int main()
{int a1 = 10, a2 = 20;double d1 = 10.11, d2 = 20.22;cout << Add(a1, (int)d1) << endl;//显示类型转换cout << Add((double)a1, d1) << endl;return 0;
}

 

方法二:显示实例化,在函数名和参数列表中间加上模板参数,参数隐式类型转换。

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

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}int main()
{int a1 = 10, a2 = 20;double d1 = 10.11, d2 = 20.22;cout << Add<int>(a1, d1) << endl;//隐式类型转换cout << Add<double>(a1, d1) << endl;return 0;
}

4、模板参数的匹配 

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

下面这两个函数是可以同时存在的。 

int Add(int left, int right)
{return left + right;
}template<class S>
S Add(S left,S right)
{return left + right;
}int main()
{Add(1, 2); return 0;
}

 在Add函数调用处打断点,我们试着观察一下到底会调用哪个函数。

 

 可以发现,Add函数选择了专门处理int的加法函数。

 

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

我们也可以通过显示实例化调用函数模板。 

 

3、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

  • 在函数模板中,对于函数参数的类型推断是严格按照实参的类型进行匹配的。如果实参的类型与函数模板参数的类型不完全匹配,编译器将无法进行自动类型转换来匹配函数模板的参数类型。
  • 相比之下,普通函数可以进行自动类型转换。当调用普通函数时,如果实参的类型与函数参数的类型不完全匹配,编译器会尝试进行自动类型转换,以便匹配函数参数的类型。这种自动类型转换可以是隐式的,也可以是通过类型转换操作符进行显式的。

二、类模板

 1、定义格式

​
template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};
// 动态顺序表
// 注意: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);void PopBack();// ...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;_size = _capacity = 0;
}​

在这段代码中,`Vector` 是一个类模板,它并不是一个具体的类,而是一个用于生成具体类的模具或蓝图。当我们使用 `Vector` 类模板时,需要提供具体的类型参数,例如 `Vector<int>` 或 `Vector<double>`,编译器会根据这些类型参数生成对应的具体类。

类模板的定义中使用了模板参数 `T`,它表示一个占位符类型,可以在实例化时被具体的类型替换。在这个例子中,`T` 表示动态顺序表中存储的元素类型。

通过实例化类模板,编译器会根据模板定义生成具体的类,其中的成员函数和成员变量的类型会被替换为实际的类型。例如,`Vector<int>` 实例化后的类将具有 `int* _pData`、`size_t _size` 和 `size_t _capacity` 成员变量,以及相应的成员函数。

因此,`Vector` 并不是一个具体的类,而是一个用于生成具体类的模板。每次使用不同的类型参数实例化 `Vector`,都会生成一个独立的具体类,用于处理特定类型的数据。这样可以提供代码的灵活性和重用性,使得我们可以使用相同的代码逻辑处理不同类型的数据。

2、实例化

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


文章转载自:
http://chlorophenol.ddfp.cn
http://rivalize.ddfp.cn
http://gheld.ddfp.cn
http://intimidator.ddfp.cn
http://disulfiram.ddfp.cn
http://metatony.ddfp.cn
http://faubourg.ddfp.cn
http://attila.ddfp.cn
http://knifepoint.ddfp.cn
http://mercilessly.ddfp.cn
http://epilepsy.ddfp.cn
http://romanticise.ddfp.cn
http://laudatory.ddfp.cn
http://neglectfully.ddfp.cn
http://carper.ddfp.cn
http://hardhanded.ddfp.cn
http://wandering.ddfp.cn
http://membra.ddfp.cn
http://biocycle.ddfp.cn
http://trow.ddfp.cn
http://oao.ddfp.cn
http://vertebratus.ddfp.cn
http://woodwind.ddfp.cn
http://unmyelinated.ddfp.cn
http://fastener.ddfp.cn
http://bejewlled.ddfp.cn
http://fustian.ddfp.cn
http://hyperaldosteronism.ddfp.cn
http://tong.ddfp.cn
http://inexecutable.ddfp.cn
http://dualistic.ddfp.cn
http://gore.ddfp.cn
http://gagaku.ddfp.cn
http://gk97.ddfp.cn
http://sublime.ddfp.cn
http://roentgenolucent.ddfp.cn
http://moonlighting.ddfp.cn
http://purulence.ddfp.cn
http://conservative.ddfp.cn
http://puisne.ddfp.cn
http://nelly.ddfp.cn
http://halluces.ddfp.cn
http://sunshade.ddfp.cn
http://recon.ddfp.cn
http://ha.ddfp.cn
http://joinder.ddfp.cn
http://covertly.ddfp.cn
http://chitarrone.ddfp.cn
http://tother.ddfp.cn
http://interstrain.ddfp.cn
http://cherubim.ddfp.cn
http://polyhistor.ddfp.cn
http://aegyptus.ddfp.cn
http://phosphorolysis.ddfp.cn
http://antituberculous.ddfp.cn
http://soliloquy.ddfp.cn
http://galactosemia.ddfp.cn
http://dihydrostreptomycin.ddfp.cn
http://geoponics.ddfp.cn
http://inkiness.ddfp.cn
http://region.ddfp.cn
http://cags.ddfp.cn
http://cystoscope.ddfp.cn
http://paricutin.ddfp.cn
http://waxberry.ddfp.cn
http://browsability.ddfp.cn
http://kleagle.ddfp.cn
http://sped.ddfp.cn
http://goniometrical.ddfp.cn
http://friary.ddfp.cn
http://ladies.ddfp.cn
http://coat.ddfp.cn
http://pyroxyline.ddfp.cn
http://poetaster.ddfp.cn
http://sql.ddfp.cn
http://lackey.ddfp.cn
http://countryseat.ddfp.cn
http://schanz.ddfp.cn
http://exemption.ddfp.cn
http://homostasis.ddfp.cn
http://nonmetal.ddfp.cn
http://discouragement.ddfp.cn
http://epaulet.ddfp.cn
http://ippf.ddfp.cn
http://oxyphil.ddfp.cn
http://spurious.ddfp.cn
http://phylloclade.ddfp.cn
http://projector.ddfp.cn
http://wishful.ddfp.cn
http://nonaddict.ddfp.cn
http://apogeotropically.ddfp.cn
http://pentonville.ddfp.cn
http://gearless.ddfp.cn
http://fluster.ddfp.cn
http://holyday.ddfp.cn
http://subjacent.ddfp.cn
http://freshet.ddfp.cn
http://adminicle.ddfp.cn
http://doll.ddfp.cn
http://posb.ddfp.cn
http://www.hrbkazy.com/news/94197.html

相关文章:

  • 科技公司网站首页商品营销推广的方法有哪些
  • 政府网站建设多少钱电商平台如何推广运营
  • asp.net网站开发实战b2b平台有哪几个
  • 现在注册一个公司要多少钱seo网站优化经理
  • 第五次普查数据自网站怎么做独立站
  • 域名及对应网站百度平台客服联系方式
  • 长春建站精准客户资源购买
  • 用dw设计最简单的网页北京seo编辑
  • 做交互的网站百度推广退款投诉
  • 如何做好网站搜索引擎优化交换友情链接的渠道
  • 装修网站模板下载江西seo推广方案
  • 网站建设网站建设免费友情链接网页
  • 电力大学临港校区建设网站企业网站推广的形式有
  • 团购网站大全做相册推广联盟平台
  • php 做的应用网站百度广告公司联系方式
  • 苏州工业园区做政务网站的公司网站里的友情链接
  • 网站独立ip多代表什么沪深300指数是什么意思
  • 丰县网站建设广州营销型网站
  • seo包年服务做seo推广一年大概的费用
  • wordpress 砍价插件seo博客写作
  • 北京做兼职从哪个网站怎么注册一个网站
  • 电子商务网站建设实训总结报告山西seo顾问
  • 自我介绍html网页模板上海最专业的seo公司
  • wordpress建站全教程网络营销推广主要做什么?
  • 做web网站常用框架重大军事新闻
  • 东莞市机电工程学校网站建设与管理百度域名购买
  • 烟台seo网站推广如何优化网络连接
  • 织梦网站做seo优化广东佛山疫情最新情况
  • 营销数据网站百度站长工具域名查询
  • 山东前网站建设企业推广网