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

news2024/12/25 0:58:09

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.coloradmin.cn/o/1636673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

test4282

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

ChatGPT 网络安全秘籍(一)

原文&#xff1a;zh.annas-archive.org/md5/6b2705e0d6d24d8c113752f67b42d7d8 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 在不断发展的网络安全领域中&#xff0c;由 OpenAI 推出的 ChatGPT 所代表的生成式人工智能和大型语言模型&#xff08;LLMs&#xf…

首页最新 多IP浏览器防关联:如何配置多个独立且稳定的IP地址?

在互联网时代&#xff0c;IP地址的重要性不言而喻。然而&#xff0c;IP关联问题却成为一项令人担忧的隐私和安全挑战。针对这个问题&#xff0c;多IP浏览器是一种解决方案&#xff0c;可以帮助用户单独配置多个独立且稳定的IP地址&#xff0c;有效地防止IP关联。 一、IP关联是…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(七)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 14 节&#xff09; P14《13.ArkUI组件-自定义组件》 将可变部分封装成组件的成员变量&#xff1a; 1、首先给标题添加两个图标&am…

百川crm系统 教育crm系统 一款高效的培训机构管理系统

在教育培训行业日益竞争激烈的今天&#xff0c;如何精准把握客户需求、提升服务质量、实现客户价值最大化&#xff0c;成为了每一家教育培训机构都必须面对的问题。为此&#xff0c;一款高效、智能的CRM客户管理系统成为了教育培训机构不可或缺的得力助手。本文将为您详细介绍这…

使用xshell工具连接ubuntu的root账户被拒绝的解决方法

问题描述&#xff1a; 我在使用xshell工具远程连接Ubuntu虚拟机的过程中&#xff0c;如果连接的是的普通用户则xshell工具可以正常连接&#xff0c;但是当我向连接ubuntu系统的root用户&#xff0c;即便是密码输入正确但还是不能连接成功。不能连接成功的截图如下&#xff1a; …

C#---使用Coravel实现定时任务

Coravel是一款框架轻&#xff0c;使用简单&#xff0c;支持秒级定时任务。 1.添加NuGet引用 2.定义自己的工作任务 using Coravel.Invocable; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Thread…

【navicat】oracle library is not loaded 问题复现和解决方案

问题原因&#xff1a;客户端oci版本安装错误&#xff0c;navicat需要64位的oci,但是使用32位的oci。 解决方案&#xff1a;官网下载64位oci进行配置。本次演示的解决多了splplus&#xff0c;其实不必要安装也能运行。 首先判断是否数据库已经打开 尝试使用splplus连接数据库 1…

MYSQL自联结

文章目录 查找&#xff1a;生产ID为DTNTR物品的供应商&#xff0c;生产的其他物品。子查询自联结比较 查找&#xff1a;生产ID为DTNTR物品的供应商&#xff0c;生产的其他物品。 子查询 SELECTprod_id,prod_name FROMproducts WHEREvend_id ( SELECT vend_id FROM product…

静电纺聚丙烯腈(PAN)纳米纤维膜

静电纺聚丙烯腈&#xff08;PAN&#xff09;纳米纤维膜是通过静电纺丝技术制备的一种纳米级纤维膜材料。静电纺丝技术利用高压电场使带电的聚合物溶液或熔体在喷丝口形成细流&#xff0c;经过拉伸、固化后形成纳米纤维&#xff0c;最终收集形成纳米纤维膜。 PAN纳米纤维膜具有以…

Unity涂鸦纹理实现

文章目录 前言实现过程UV坐标和UI坐标对齐修改像素代码 前言 心血来潮实现下场景中提供一张纹理进行涂鸦的功能。 最终实现效果: 实现过程 UV坐标和UI坐标对齐 这里的纹理使用了UGUI的Canvas进行显示&#xff0c;所以这里使用一张RawImage。 因为Unity的视口坐标是以左下角…

微服务之SpringCloud AlibabaSeata处理分布式事务

一、概述 1.1背景 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用&#xff0c;就会产生分布式事务问题 but 关系型数据库提供的能力是基于单机事务的&#xff0c;一旦遇到分布式事务场景&#xff0c;就需要通过更多其他技术手段来解决问题。 全局事务&#xff1a;…

SOLIDWORKS2021:革新设计界的里程碑,引领您迈向数字化制造未来

在2021年&#xff0c;SOLIDWORKS 2021的发布犹如一股清新的创新之风&#xff0c;吹遍了整个设计与工程领域。作为业界领先的3D CAD解决方案&#xff0c;SOLIDWORKS 2021不仅巩固了其在设计软件领域的领导地位&#xff0c;更以前所未有的方式激发了设计者的创造力与生产力。亿达…

Flask教程3:jinja2模板引擎

文章目录 模板的导入与使用 模板的导入与使用 Flask通过render_template来实现模板的渲染&#xff0c;要使用这个方法&#xff0c;我们需要导入from flask import rander_template&#xff0c;模板中注释需放在{# #}中 模板的第一个参数为指定的模板文件名称&#xff0c;如自定…

有关CSS中排版常见问题(清除默认样式问题 + 元素居中问题 + 元素之间的空白问题 + 行内块的幽灵空白问题)

前言&#xff1a;在练习CSS排版的时候&#xff0c;我们经常会遇到一些排版上的问题&#xff0c;那么我们如何去解决这些问题呢&#xff1f;本篇文章给出了一些新手在练习排版时候可能会遇到的问题的解决方案。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

1天搞定uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时&#xff0c;不可避免的要用到可视化的数据管理后台&#xff0c;而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1&#xff0c;下载HBuilderX 开发者…

Python 可以对数据进行哪些可视化?

Python 可视化 一、条形图&#xff08;或柱状图&#xff09; 1.代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pddf pd.DataFrame({County:[America,Canada,Australia,Germany,French,China],GDP:[80,30,70,80,60,75] })plt.bar(df[County],df[G…

Linux 虚拟主机切换php版本及参数

我使用的Hostease的Linux虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机&#xff0c;但是没有找到切换PHP以及查看PHP有哪些版本的位置&#xff0c;因此咨询了Hostease的技术支持&#xff0c;寻求帮助了解到可以实现在cPanel面板上找到此切换PHP版本的按钮&…

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x新特性)

ElasticSearch教程入门到精通——第二部分&#xff08;基于ELK技术栈elasticsearch 7.x新特性&#xff09; 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2 文…

Docker部署RabbitMQ与简单使用

官网地址&#xff1a; Messaging that just works — RabbitMQ 我的Docker博客:Docker-CSDN博客 1.结构 其中包含几个概念&#xff1a; **publisher**&#xff1a;生产者&#xff0c;也就是发送消息的一方 **consumer**&#xff1a;消费者&#xff0c;也就是消费消息的一方 …