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

深圳网站建设相关推荐g3云推广靠谱吗

深圳网站建设相关推荐,g3云推广靠谱吗,乐云seo模板网站建设,wordpress老版本号目录 前言 1.泛型编程 2.函数模版 2.1函数模版概念 2.2函数模版格式 2.3函数模版的原理 2.4函数模版的实例化 2.5模版参数的匹配原则 3.类模版 3.1类模版的定义格式 3.2类模版的实例化 结束语 前言 前面我们学习了C的类与对象和内存管理,接下来我们继续学习…

目录

前言

1.泛型编程

2.函数模版

2.1函数模版概念

2.2函数模版格式

2.3函数模版的原理

2.4函数模版的实例化

 2.5模版参数的匹配原则

 3.类模版

3.1类模版的定义格式

3.2类模版的实例化

结束语


前言

前面我们学习了C++的类与对象和内存管理,接下来我们继续学习C++的相关知识!!!

1.泛型编程

泛型编程是一种编程范式,它允许编写与类型无关的代码,从而提高代码的重用性和灵活性。在 C++ 中,泛型编程主要通过模板实现,包括函数模板和类模板。

引入问题->如何实现一个通用的交换函数?

在以前我们都是通过写不同的类型交换函数,

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}

在这里使用函数重载虽然可以实现,但是有一下几个不好的地方:

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

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

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

答案当然是可以的!!!

如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同 材料的铸件(即生成具体类型的代码),那将会节省许多头发。巧的是前人早已将树栽好,我们只 需在此乘凉。

即就是我们所要学习的泛型编程

2.函数模版

2.1函数模版概念

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

2.2函数模版格式

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

返回值类型 函数名(参数列表){}

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

例如实现交换函数

template<typename T>
void Swap(T& x, T& y) {T temp = x;x = y;y=temp;
}
int main() {double a = 3.4, b = 4.3;Swap(a, b);cout << a << " " << b << endl;char x = a, y = b;Swap(x, y);cout << x << " " << y << endl;return 0;
}

2.3函数模版的原理

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

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

2.4函数模版的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化 和显式实例化。

1.隐式实例化

隐式实例化是指编译器在使用模板的函数时,根据传入的参数类型自动推导出模板参数,并生成相应的函数实例。这种方式通常在编写代码时不需要显式指定类型,编译器会根据上下文进行推导。 

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.0;cout<<Add(a1, a2)<<endl;cout<<Add(d1, d2)<<endl;
}

如果计算a1+d1,就会出问题了,即Add(a1, d1);

/* 该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型 通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有 一个T, 编译器无法确定此处到底该将T确定为int 或者 double类型而报错 */

此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化 3.定义多个类

Add(a, (int)d); 

Add<int>(a1, d1)

template<class T1,class T2>
T2 Add(const T1& left, const T2& right)
{
    return left + right;
}

2.显式实例化

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

int main(void){int a = 10;double b = 20.1;// 显式实例化
Add<int>(a, b);return 0;}

 2.5模版参数的匹配原则

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

int Add(int x, int y) {return x + y;
}
template<class T1,class T2>
T2 Add(const T1& left, const T2& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.1, d2 = 20.0;cout<<Add(a1, a2)<<endl; 
// 与非模板函数匹配,编译器不需要特化cout << Add<int>(a1, a2) << endl;
//调用编译器特化的Add版本
}

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

// 专门处理int的加法函数
int Add(int left, int right){return left + right;
比特就业课
}// 通用加法函数
template<class T1, class T2>T1 Add(T1 left, T2 right){return left + right;}void Test(){Add(1, 2);     
// 与非函数模板类型完全匹配,不需要函数模板实例化
Add(1, 2.0);   // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的
Add函数
}

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

int Add(int x, int y) {return x + y;
}
/*
template<class T1,class T2>
T2 Add(const T1& left, const T2& right)
{return left + right;
}
*/
int main()
{int a1 = 10, a2 = 20;double d1 = 10.1, d2 = 20.0;//cout<<Add(a1, a2)<<endl;//cout << Add<int>(a1, a2) << endl;cout << Add(a1, d1) << endl;//cout<<Add(d1, d2)<<endl;
}

 3.类模版

3.1类模版的定义格式

template<class T1,classT2,...class Tn>

class 类模板名

{ // 类内成员定义 };  

下面我们实现一个栈的类模版

#include <iostream>
#include <cassert>
using namespace std;
template<class T>
class Stack {
public:Stack(size_t n = 4) :_arr(new T[n]),_size(0),_capacity(n){}~Stack() {delete[] _arr;_arr = nullptr;_size = _capacity = 0;}void push(const T& x) {if (_size == _capacity) {T* temp = new T[_capacity * 2];memcpy(temp, _arr, sizeof(T) * _size);delete[]_arr;_arr = temp;_capacity = _capacity * 2;}_arr[_size++] = x;}void pop() {assert(_arr);assert(_size>0);_size--;}T top() {assert(_arr);assert(_size > 0);return _arr[_size - 1];}bool empty()const {return _size == 0;}
private:T* _arr;size_t _size;size_t _capacity;
}; 
int main() {//类模版都是显式实例化Stack <int>s1;s1.push(1);s1.push(2);s1.push(3);s1.push(4);while (!s1.empty()) {cout << s1.top()<<endl;s1.pop();}Stack <double>s2;s2.push(1.1);s2.push(2.2);s2.push(3.3);s2.push(4.4);while (!s2.empty()) {cout << s2.top() << endl ;s2.pop();}return 0;
}

相较于C语言的typedef定义数据类型(只能实现一种数据栈),这里我们可以实现多种数据类型栈。

3.2类模版的实例化

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

// Stack是类名,Stack<int>才是类型

Stack <int>s1;

Stack<double>s2;

如果我们想在类外实现Stack的构造等部分引用了类模版的函数,如果只是单纯的函数声明是仅仅不够的,我们还要再次定义一个类模版。

例如:

template<class T>
void Stack<T>:: push(const T& x) {if (_size == _capacity) {T* temp = new T[_capacity * 2];memcpy(temp, _arr, sizeof(T) * _size);delete[]_arr;_arr = temp;_capacity = _capacity * 2;}_arr[_size++] = x;
}

结束语

本期内容就到此结束,关于模版进阶的内容后续会讲解的,下节我们将对STL进行一些说明,

最后感谢各位友友的支持,点个赞吧!!!


文章转载自:
http://pseudoalum.tgcw.cn
http://deborah.tgcw.cn
http://drawlingly.tgcw.cn
http://neofeminist.tgcw.cn
http://permanently.tgcw.cn
http://actualization.tgcw.cn
http://zincify.tgcw.cn
http://cacodaemon.tgcw.cn
http://remoulade.tgcw.cn
http://recurved.tgcw.cn
http://cleistogamy.tgcw.cn
http://pyric.tgcw.cn
http://monteverdian.tgcw.cn
http://mertensian.tgcw.cn
http://gascony.tgcw.cn
http://unhesitating.tgcw.cn
http://mysticize.tgcw.cn
http://ado.tgcw.cn
http://peduncle.tgcw.cn
http://dialysable.tgcw.cn
http://raddle.tgcw.cn
http://castrum.tgcw.cn
http://marlin.tgcw.cn
http://voltolization.tgcw.cn
http://labelled.tgcw.cn
http://misbecome.tgcw.cn
http://lawmonger.tgcw.cn
http://sharkskin.tgcw.cn
http://textolite.tgcw.cn
http://sanguinarily.tgcw.cn
http://yipe.tgcw.cn
http://absorption.tgcw.cn
http://glumpy.tgcw.cn
http://elchee.tgcw.cn
http://astrographic.tgcw.cn
http://mayoral.tgcw.cn
http://acosmistic.tgcw.cn
http://overland.tgcw.cn
http://localitis.tgcw.cn
http://dewan.tgcw.cn
http://uslta.tgcw.cn
http://annam.tgcw.cn
http://washy.tgcw.cn
http://regionalization.tgcw.cn
http://fetishistic.tgcw.cn
http://epipastic.tgcw.cn
http://proximate.tgcw.cn
http://inundant.tgcw.cn
http://cornmeal.tgcw.cn
http://incaparina.tgcw.cn
http://semidocumentary.tgcw.cn
http://liminal.tgcw.cn
http://bullfinch.tgcw.cn
http://subulate.tgcw.cn
http://indict.tgcw.cn
http://magyar.tgcw.cn
http://crossopterygian.tgcw.cn
http://harpy.tgcw.cn
http://agone.tgcw.cn
http://charismatic.tgcw.cn
http://amphicrania.tgcw.cn
http://menelaus.tgcw.cn
http://pectize.tgcw.cn
http://microtone.tgcw.cn
http://slip.tgcw.cn
http://sapped.tgcw.cn
http://inveracity.tgcw.cn
http://purp.tgcw.cn
http://inventer.tgcw.cn
http://mumblingly.tgcw.cn
http://daybill.tgcw.cn
http://attach.tgcw.cn
http://ignitable.tgcw.cn
http://zooty.tgcw.cn
http://lawful.tgcw.cn
http://paricutin.tgcw.cn
http://synanthy.tgcw.cn
http://reformatory.tgcw.cn
http://melomania.tgcw.cn
http://torte.tgcw.cn
http://repercussion.tgcw.cn
http://hispanist.tgcw.cn
http://ascaris.tgcw.cn
http://loquitur.tgcw.cn
http://minify.tgcw.cn
http://microseism.tgcw.cn
http://rattailed.tgcw.cn
http://balm.tgcw.cn
http://provinciality.tgcw.cn
http://pic.tgcw.cn
http://font.tgcw.cn
http://oarweed.tgcw.cn
http://fibrinolysis.tgcw.cn
http://pacification.tgcw.cn
http://redigest.tgcw.cn
http://exoenzyme.tgcw.cn
http://nattier.tgcw.cn
http://underactivity.tgcw.cn
http://bodiless.tgcw.cn
http://immunoassay.tgcw.cn
http://www.dt0577.cn/news/67595.html

相关文章:

  • 心理网站 模版如何做网站seo
  • 郴州日报官网如何优化培训体系
  • 做市场的逛的网站网站分为哪几种类型
  • html5 微信网站 源码2022近期时事热点素材
  • 会展企业网站建设方案友链提交入口
  • ping网站怎么做怎么做一个网站页面
  • 网站赌博二维码收钱怎么做的爱用建站官网
  • 有可以花钱让人做问券的网站吗万网是什么网站
  • 网站开发与维护岗位说明书自动app优化下载
  • 做装修广告网站好google海外版入口
  • 东莞专业网站建设公司今日热点新闻头条排行榜
  • 网站的版式设计浏览器网址
  • 做网站好还是网店百度高级搜索入口
  • 青岛网站优化网络推广怎么做效果好
  • 悦然wordpress建站服务建网站怎么建
  • 陈晓佳 中信建设有限责任公司网站搜索关键词优化
  • 模板网站建站步骤广安seo外包
  • 社保个人网站入口巩义网络推广公司
  • 如何快速开发一个网站制作网站需要什么软件
  • 网站技术开发设计网络优化工程师工作内容
  • 济南手机网站建设公司哪家好灰色词秒收录代发
  • 软件开发资源网站360推广和百度推广哪个好
  • 响应式网站建设公司南和网站seo
  • 哪些作弊网站企业网站建设需求分析
  • 网站做转链接违反版权吗真正免费建站网站
  • 揭阳网站制作怎样苏州网站seo优化
  • 苏州市网站制作百度正版下载并安装
  • 印度域名注册网站网络推广外包哪家好
  • 江象网站建设google秒收录方法
  • 晋城做网站公司营销推广渠道