C++语法之在谈const与模版参数

最近一直在复习C++的语法,感觉遇到了不少问题,或许是之前没想的这么深。废话不说,开始说正事。

一、再谈const

有些朋友可能有些疑问,不就是const吗?我知道,const可以给非const赋值,反过来不行,但是真的仅仅只是这么简单嘛?绝对不是,如果这么简单,那么我们在写代码的时候就不会出现const不可转换其他类型的错误了。希望大家可以认真看完,绝对是可以学到一些知识。(大佬除外)

看看下面的这道题,如下:

1,2,3这三个到底哪个是对的,还是那个是错误的,或是全对,亦或是全错?其实这里牵扯到了很多基础的知识,我个人认为是那种平常老师所说的基本功问题。

首先,不用判断的是,1绝对是对的。这个不知道大家有没有疑惑,其实很简单,就是定义了一个指针,修饰指针指向的内容是不可改的,但是指针本身可改。K函数的参数也就是形参是指针引用,也就是引用了ca。这个为什么是对的呢?很简单,就是我实参不可修改的*ca,所以形参在接受的时候,首先形参的*p是不可修改的,所以形参的const必须加在类型前,也就是A前,其次就很好理解了,那就是引用,直接引用即可。第一个还是很好理解的。

第二个,很明显错了,有些朋友可能懵了,what?实参是最大的权限,可修改任何地方(此处指可修改**p,*p,p),而形参只有不可修改**p,为什么是错的呢?很明显的正确啊,但是错了兄弟,格局小了,有些人很疑惑,为什么啊,为什么,这里形参的**p对是实参的**p是没有威胁的,因为按照权限来说,这里是把实参的权限给变小了,权限是可变小,可平移,不可放大的,但是这里是缩小,为什么还不对呢?其实很简单,这里就是我说格局小的原因,因为形参的**p是不可修改的,但是*p会啊,他会修改啊,有些朋友可能明白了,对没错,因为存在*p可修改的原因,导致他可能会把一级指针的内容修改了,也就是把一级指针的内容改成其他地址,所以这是一个潜在风险,所以不可以,所以2错误。理解了2,那么3相信大家应该是可以理解了吧,3明显是对的。这里就不再说了。

那么,三级指针呢??如下:

int a = 10;
int* p = &a;
int** pp = &p;
int*** ppp = &pp;
const int* const * ptr = pp;
const int*const*const * pppp = ppp;

正确的是上面这样写的。原理其实很简单,我感觉我其实没必要去背多余的八股文这些,什么时候加const,很简单,那就是没有威胁,什么是没有威胁??那就是不会对你指向的值产生威胁,也就是不会有潜在风险修改指向内容的值的时候,就合法的,如果有,那就要加const。引用其实也是同样的道理,这里就不再详细说明。所以,我们在想用不用const的时候,就看看有没有“威胁”。

二、模版参数

很多人可能说,模版没必要说,其实不然,不知道大家有没有这样写过代码,如下:

这是我昨晚复习STL时,写的代码,其实这个模版参数是错误的,但是,,,,,,有个方法直接可以把这个改对,是的,虽然模版参数不应该这样写,但是有一个方法可以修改,还是对的,还就是模版参数中。相信有些朋友猜到了,没错,就是typename。

typename不用多说,定义模版参数和说明是类型时用到的关键字。其实class 与 typename在定义模版参数的时候,是一样的,没有区别,这个是对的,但是我一直的疑惑就是这个,为什么我把class改成typename就对了,在模版参数中不是class 和typename一样吗,那他错在哪里了,为什么typename对,而class是错的,其实很简单,依赖类型。

模版参数类型有三种,类型参数,非类型参数,模版类型模版参数。

而其中有一种类型是依赖类型,什么鬼??什么是依赖类型,其实很简单,就是依赖模版类型的变量,假如模版参数中定义的T, 那么我们一般会用T来定义变量,那么此时这个变量就是依赖类型,因为他依赖了模版参数的类型。这种类型就必须要用typename来说明,所以很显然,如果我上面的那一块必须要这样写的话,那么就必须要用typename,而不能用class。(其实就是一个非类型参数)。这里想说的是模版参数中也要遵循这个规则,当编译器不知道是类型还是变量的时候都要用typename,类外,以上写法是错误的,就是想给大家说说,typename在模版参数的定义中也要注意变量还是类型,很重要。其实,定义模版时,建议用typename(虽然自己用的是class)。

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

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

相关文章

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

javax.net.ssl.SSLException: Received fatal alert: protocol_version已经解决

起因: 在帮别人讲解项目时,将项目的tomcat配置完,点击运行后,报错,信息如标题。 解决办法: 在csdn百度问题,得到的方法主要有几个: 1.jdk要配置在1.8以上; 2.数据库地…

Stable Diffusion是什么?

目录 一、Stable Diffusion是什么? 二、Stable Diffusion的基本原理 三、Stable Diffusion有哪些运用领域? 一、Stable Diffusion是什么? Stable Diffusion是一个先进的人工智能图像生成模型,它能够根据文本描述创造出高质量的图…

信息检索(36):ConTextual Masked Auto-Encoder for Dense Passage Retrieval

ConTextual Masked Auto-Encoder for Dense Passage Retrieval 标题摘要1 引言2 相关工作3 方法3.1 初步:屏蔽自动编码3.2 CoT-MAE:上下文屏蔽自动编码器3.3 密集通道检索的微调 4 实验4.1 预训练4.2 微调4.3 主要结果 5 分析5.1 与蒸馏检索器的比较5.2 …

网络运维故障排错思路!!!!!(稳了!!!)

1 网络排错的必备条件 为什么要先讲必备条件?因为这里所讲的网络排错并不仅仅是停留在某一个小小命令的使用上,而是一套系统的方法,如果没有这些条件,我真的不能保证下面讲的这些你可以听得懂,并且能运用到实际当中&a…

Unity值类型和引用类型

我们都知道C#编程语言中,数据类型被分为了两种: 值类型引用类型 那么什么是值类型?什么是引用类型呢?它们的区别又是什么? 为了搞清楚这些问题,我们先列举一下我们开发中会碰到的值类型和引用类型。 常…

【AI+老照片焕新】母亲节用AI把时间的印记变成暖心礼物

想念是一张泛黄的照片,藏在抽屉里的笑容,总是那么亲切。今天是母亲节,是不是想给妈妈来点不一样的惊喜?用AI技术,把那些老照片瞬间焕新,让妈妈的青春记忆重放光华! 想象一下,妈妈年…

如何根据招聘信息打造完美简历

如何根据招聘信息打造完美简历 招聘信息分析简历调整策略个性化与关键词结语 在求职过程中,简历是第一块敲门砖。它不仅展示了你的专业技能和工作经验,还体现了你对所申请职位的理解和热情。然而,如何从招聘信息中提炼关键点,打造…

scrapy的入门

今天我们先学习一下scrapy的入门,Scrapy是一个快速的高层次的网页爬取和网页抓取框架,用于爬取网站并从页面中提取结构化的数据。 1. scrapy的概念和流程 1.1 scrapy的概念 我们先来了解一下scrapy的概念,什么是scrapy: Scrapy是一个Python编写的开源网络爬虫框架…

WebSocket前后端建立以及使用

1、什么是WebSocket WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它提供了一种持久化的连接,允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据,实现了实时的双向通信。 这部分直接说你可能听不懂;我…

王麻子1651商标被王麻子跨类无效宣告!

近日“王麻子1651”商标被王麻子跨类无效宣告,最后不予注册,普推知产老杨了解“王麻子”是我国著名的老字号,创始于1651年,以刀剪闻名于世,刀剪的商标分类主要是在8类手工器械,而被无效宣告的商标在16类办公…

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具,其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息,还能有效提高工作效率。然而,市场上很多便签应用仅限于单一平台使用,对于需要在手机和电脑间频繁切换…

如何到《新英格兰医学杂志》 NEJM查找下载文献

《新英格兰医学杂志》NEJM是世界上阅读、引用最广泛、影响力最大的综合性医学期刊之一。NEJM集团出版的期刊还包括NEJM Journal Watch、NEJM Catalyst及NEJM Evidence。NEJM是一份全科医学周刊,出版对生物医学科学与临床实践具有重要意义的一系列主题方面的医学研究…

json-server 模拟接口服务

前端开发经常需要模拟接口请求,可以通过 json-server 实现。 1. 安装 json-server 在前端项目的终端命令行中执行 npm i json-server2. 创建数据源 在项目中新建文件 db.json ,与 package.json 同级,内容为模拟的数据 注意 json 文件对格式…

选择步入式高低温试验室价格除外还需要考虑哪些方面?

选择步入式高低温试验室时,价格是一个非常重要的考虑因素。但是,步入式高低温试验室价格不仅仅是主要决定因素,我们还需要考虑到设备的性能、质量、可靠性以及售后服务等多方面因素。接下来给大家具体介绍的关于选择步入式高低温试验室价格除…

conan2 基础入门(06)-conanfile.py入门

conan2 基础入门(06)-conanfile.py入门 文章目录 conan2 基础入门(06)-conanfile.py入门⭐准备预备文件和Code ⭐使用流程指令 ⭐具体讲解conanfile.pyconan install END视频教学 ⭐准备 注意,如果想跟好的学习conanfile.py建议使用python来安装conan。 当然使用其…

C++入门系列-构造函数

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地,而且建议有多份副本 备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方 冗余: 数据有多份冗余,但不等备份&…

JVM---垃圾回收

目录 一、C/C的内存管理 二、Java的内存管理 三、垃圾回收的对比 四、Java的内存管理和自动垃圾回收 五、方法区的回收 手动触发回收 六、堆回收 如何判断堆上的对象可以回收? 引用计数法 可达性分析算法 五种对象引用 软引用 软引用的使用场景-缓存 弱引用 虚…

机柜风扇KTS011温湿度控制器KTO011风机控制温控器机械开关温控仪

品牌:威驰 型号:KTS011常开 产地:中国大陆 颜色分类:KTS011常开,KTO011常闭 KTS011与KTO011的区别 KTS011,常开型,可搭配风扇/风机使用:当环境温度超过温控器设定温度,温控…