C++相关概念和易错语法(10)(定位new、模板)

1.定位new

我们使用类来实例化对象,开辟空间的时候会自动去调用它的构造函数。但在那篇博客我就特意强调过,使用a.A()的方式是错误的,A()根本不会被识别为一个构造函数,而会被识别为A类型。因此我们要注意最好在实例化对象,开辟空间时就对它进行初始化。

当我们向内存池申请空间,使用malloc时无法直接调用构造函数,我们需要主动去调用构造函数,那应该怎么办呢?这就需要使用定位new了。

注意格式中new后面的括号内的是指针,之后跟初始化信息,单参数用小括号,多参数要用花括号。这种初始化也遵循隐式类型转换规则,和前面相似。

定位new的使用场景很少,如果我们想将一个已使用对象初始化,我们就可以使用这种办法,同时,它在内存池(池化技术)中使用比较多,池化技术即一次向堆申请一大块空间(减少操作系统负担),每次需要开辟空间时就会去找自己的内存池,用完将整块空间还回操作系统。

2.函数模板

C语言中,当我们需要使用实现方式相同,但数据类型不同的函数时,我们只有多依靠复制粘贴实现多个极为相似的函数,这样会使代码变得冗长,而且使得效率低下,因此C++中引入了模板的概念,具体又分为函数模板和类模板。

(1)函数前声明template<typename T1, typename T2...>(也可写作template<class T1, class T2...>),标志着这个函数针对广泛类型编程,也叫泛型编程

注意:template<typename T1, typename T2...>是函数模板的一部分,我们在使用的时候必须加上它且不能和函数主体分离

(2)函数模板看起来像是一个函数,但其实当我们用多种类型去调用这个函数模板时,底层编译器将这个模板实例化成了多个函数,分别去匹配。

虽然调试的时候看起来是一份函数,但在反汇编看得出来其实是多个函数构成函数重载

因此我们可以总结出模板的原理:编译器根据传参的类型实例化模板生成函数或类,本质上是多个函数或类,在C语言中我们需要自己写,现在是编译器帮我们实现了(半自动化),可以提高代码效率

(3)typename与class等价,两者一般可以互换

(4)template推演问题

当函数参数类型不一致时,函数模板推演就会产生歧义,这个时候我们需要显式实例化(可能会出现隐式类型转化),或者使用多个typename来处理歧义。对于返回类型,如果会产生多种返回情况,可通过auto类型来规避。

(4)函数匹配原则

普通函数、函数模板如果都能匹配我们的调用时,应该怎样规定优先级呢?

a.如果参数能直接匹配普通函数(有现成的函数),那就直接调用该函数而不会去调用函数模板。

如果匹配不上,会去匹配函数模板

b.要注意匹配普通函数时是看参数合不合适,编译器不会去看返回值合不合适。

c.要注意匹配普通函数是指完全匹配,并不会去考虑隐式类型转换如果需要通过隐式类型转换才能匹配普通函数的话,那就不符合规则(无const -> 有const也算作一种隐式类型转换),不会优先去匹配普通函数。

d.如果普通函数的参数不能匹配,就会去匹配更符合的函数模板,首先会去看参数部分,参数部分匹配会在完美匹配的基础上尽可能简洁,会用尽可能少的typename匹配

通过这里也可以看出,只要参数匹配更简洁,是不会去管返回值类型的。

关于完美匹配,一定要注意const,包括普通函数,无const -> 有const也算作一种隐式类型转换,这都不算作完美匹配

在这里我们就可以看出const T不能完美匹配无const类型,所以这个时候会去找有const修饰的typename,就算两个有const修饰的变量类型一致

 总结:先匹配普通函数,如果不能完美匹配,找函数模板,函数模板中尽可能完美匹配且简洁,实在不行就使用能隐式类型转换的。

3.类模板

(1)类模板和函数模板相似,但唯一需要注意的是类模板只能显式实例化类型

在这里,A a(2)的2是不能推演出类模板的类型的。类模板只能显式实例化类型,这是规定。

(2)类中的函数声明定义分离的时候,要注意类域的名称为:类的名称<实例化typename>,在写函数时也要在最前面生命template



不要声明定义分离到两个文件,会出现链接错误,在同一个文件可以分离

类模板的其他特性和函数模板一致,这里就不再赘述了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/592206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024/5/4 英语每日一段

But something is slowing that rocket down: lack of access to the types of data used to train robots so they can interact more smoothly with the physical world.It’s far harder to come by than the data used to train the most advanced AI models like GPT—mos…

08 IRF技术 华三交换机实现

IRF 详细介绍 我知道 AI IRF 技术是指集成路由功能(Integrated Routing and Bridging)技术,是惠普(Hewlett Packard)公司开发的一种基于硬件的虚拟化技术。IRF 技术可以将多台物理设备组合成一个逻辑设备,实现设备的高可用性和灵活性。 IRF 技术主要有以下特点: 1. …

Linux---为什么会有粘滞位?

在前面已经讲过目录的rwx权限&#xff1a; 可读权限(r): 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容. 有可写权限(w):如果目录没有可写权限&#xff0c;则无法在目录中创建文件, 也无法在目录中删除文件.可执行权限(x): 如果目录没有可执行权限, 则无法cd到…

五一后返工,3招帮你快速找回状态!

五一假期即将结束&#xff0c;如何快速进入工作状态 随着五一假期的临近结束&#xff0c;我们即将迎来新的工作挑战。在享受了短暂的休息和放松之后&#xff0c;重新调整心态&#xff0c;迅速进入工作状态显得尤为重要。本文将为您提供一些实用的方法和建议&#xff0c;帮助您…

Elasticsearch中【文档查询】DSL语句以及对应的Java实现

目录 全文检索查询 精准查询 布尔查询 排序、分页查询 高亮 地理查询 复合查询 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测…

【业务场景】京东实际场景,频繁GC引起的CPU飙高问题的解决

目录 1.业务介绍 2.判断任务类型 3.CPU飙高的原因 1.业务介绍 本文的业务场景是京东零售线公开的一篇文章&#xff0c;文章内容详细介绍了京东零售线如何将广告相关的定时任务从半小时优化到秒级的&#xff0c;原文链接&#xff1a; 半小时到秒级&#xff0c;京东零售定时…

BUUCTF:Web 解析(一)

前言 Buuctf Web 是一个在线安全挑战平台&#xff0c;旨在提高参与者对网络安全的理解和实践能力。本文将详细介绍 Buuctf Web 的特点、挑战和机遇&#xff0c;帮助读者更好地了解这一领域。 一、Buuctf Web 的特点 多样化的挑战场景&#xff1a;Buuctf Web 提供了多种挑战场…

Redis事务,管道,发布订阅

Redis事务 redis事务本质上是一组命令的集合,按照顺序串行化执行命令而不被其他命令打断 redis事务开启后将要执行的命令放到事务队列中,提交事务后一次性顺序排他地执行所有命令 关键词:单线程,无隔离级别,不保证原子性,排他性,顺序性 要注意和mysql的acid进行区分 怎么用…

【JavaEE】多线程安全问题

文章目录 1、什么是多线程安全问题2、出现线程不安全的原因2.1 线程在系统中是随机调度&#xff0c;抢占式执行的2.2 多个线程同时修改同一个变量2.3 线程针对变量的修改操作&#xff0c;不是“原子”的2.4 内存可见性问题2.5 指令重排序 3 、如何解决线程安全问题3.1 锁操作3.…

2024年3月Scratch图形化编程等级考试(三级)真题试卷

2024年3月Scratch图形化编程等级考试&#xff08;三级&#xff09;真题试卷 选择题 第 1 题 Scratch运行程序后&#xff0c;角色一定不会说出的数字是&#xff1f;&#xff08; &#xff09; A.2 B.4 C.6 D.8 第 2 题 Scratch角色初始位置如下图所示&#xff0c;右图…

14_Scala面向对象编程_属性

属性 1.类中属性声明 // 1.给Scala声明属性&#xff1b;var name :String "zhangsan"val age :Int 302.系统默认赋值 scala由于初始化变量必须赋值&#xff0c;为了解决此问题可以采用下划线赋值&#xff0c;表示系统默认赋值 , –但是此方法局限于变量&…

ArkTS开发原生鸿蒙HarmonyOS短视频应用

HarmonyOS实战课程“2024鸿蒙零基础快速实战-仿抖音App开发&#xff08;ArkTS版&#xff09;”已经于今日上线至慕课网&#xff08;https://coding.imooc.com/class/843.html&#xff09;&#xff0c;有致力于鸿蒙生态开发的同学们可以关注一下。 课程简介 本课程以原生鸿蒙Ha…

Hibernate执行流程分析及配置文详解

目录 1、Hibernate执行流程分析及配置文件详解 1&#xff09;Configuration对象 2&#xff09;ServiceRegistry对象&#xff08;hibernate4的新特性&#xff09; 3&#xff09;SessionFactory对象 4&#xff09;Session对象 5&#xff09;Transaction对象 6&#xff09;…

缓冲流,BufferReader,BufferWriter,案例

IO流的体系 字节缓冲流的作用 提高字节流读取数据的性能 *原理&#xff1a;字节缓冲输入流自带了8Kb的缓冲池&#xff0c;字节缓冲输出流也自带了8kb的缓冲池 构造器说明public BufferedInputStream(InputStream is)把低级的字节输入流包装成一个高级的缓冲字节输入流&#…

对链表进行插入排序(详细解析)

对链表进行插入排序&#xff08;详解&#xff09; 题目&#xff1a; 对链表进行插入排序 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&a…

特斯拉FSD落地分析

再续前缘 媒体的神经从马斯克的湾流私人飞机起飞那一刻开始,就开始被牵动着。28/4 号的突然访华,在大多数人看来其实已经早已是计划之中,从摆在台面上的消息来看,主要目的是为了在大陆推广FSD的落地,也为8月份FSD 的正式版本做预热,和中国上海的第一次联姻造就了特斯拉m…

17 内核开发-内核内部内联汇编学习

​ 17 内核开发-内核内部内联汇编学习 课程简介&#xff1a; Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础&#xff0c;让他们能够理解和参与到Linux内核的开发过程中…

【Linux】进程exec函数族以及守护进程

一.exec函数族 1.exec函数族的应用 在shell下敲shell的命令都是在创建shell的子进程。而我们之前学的创建父进程和子进程代码内容以及通过pid与0的关系来让父子进程执行不同的代码内容都是在一个代码文件里面&#xff0c;而shell是如何做到不在一个文件里面写代码使之成为子进…

06|LangChain | 从入门到实战 -六大组件之Agent

点点赞~ 注意&#xff1a;langchain的版本迭代比较快&#xff0c;社区维护&#xff0c;代码当中或许部分方法在某个版本不再支持 01&#xff5c;LangChain | 从入门到实战-介绍 02&#xff5c;LangChain | 从入门到实战 -六大组件之Models IO 03&#xff5c;LangChain | 从入…

asp.net结课作业中遇到的问题解决2

目录 1、如何实现评论交流的界面 2、如果想要将文字添加到数据库中&#xff0c;而不是乱码&#xff0c;该怎么修改 3、如果想要添加的数据已经存在于数据库&#xff0c;就不允许添加了&#xff0c;该如何实现 4、想要实现某个模块下有好几个小的功能该如何实现 5、想要实现…
最新文章