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…

Webpack模块联邦:微前端架构的新选择

Webpack模块联邦(Module Federation)是Webpack 5引入的一项革命性特性,它彻底改变了微前端架构的实现方式。模块联邦允许不同的Web应用程序(或微前端应用)在运行时动态共享代码,无需传统的打包或发布过程中…

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是一个先进的人工智能图像生成模型,它能够根据文本描述创造出高质量的图…

Spring IOC容器加载流程原理源码深度剖析

Spring IOC容器加载流程原理源码深度剖析 介绍 在Java开发中,Spring框架是非常常用的一个框架,它提供了很多便捷的功能和特性,其中最重要的就是IOC(Inversion of Control)容器。Spring IOC容器是Spring框架的核心&am…

邻接矩阵基础入门

引言 邻接矩阵是图论中表示图的一种方式,它通过矩阵来描述图中各顶点之间的连接关系。在邻接矩阵中,图中的每个顶点都对应矩阵中的一行和一列,矩阵中的元素表示顶点之间是否存在边以及边的权重(如果是加权图)。 定义和…

什么是ip地址?和dns地址的区别是什么?

大家都知道电脑想要上网需要配置ip地址和dns地址,手动配置、自动获取均可,但是ip地址是什么?和dns又有什么区别呢?小编给大家详细解释一下。 IP地址 IP,就是Internet Protocol的缩写,是一种通信协议,我们用…

信息检索(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 …

Flink面试整理-了解如何对Flink进行扩展和定制化开发,以满足特定的业务需求

Apache Flink 是一个灵活且可扩展的流处理框架,允许进行定制化开发以满足特定的业务需求。以下是对 Flink 进行扩展和定制化开发的几个主要方向: 1. 自定义算子(Operators) Flink 允许开发者编写自定义算子来实现特定的数据处理逻辑。例如,可以通过扩展 RichMapFunction 或…

AI学习指南概率论篇-条件概率和独立性

AI学习指南概率论篇-条件概率和独立性 概述 在人工智能领域,概率论是一项至关重要的工具。概率论不仅仅是用于量化不确定性,还在AI系统中扮演着关键角色。其中,条件概率和独立性是概率论中重要的概念之一,它们在AI领域有着广泛的…

适配qnx和linux平台的线程管理类封装

概述 封装代码仓库: https://gitee.com/liudegui/my_thread 尝试封装一个基于C11的多线程控制与调度类,适配QNX和Linux平台,它提供了以下主要功能: 线程的创建与销毁管理。线程的优先级调度。线程的CPU亲和性设置。线程的等待与…

[大师C语言(第四篇)]C语言段错误原理研究

C语言段错误原理研究(一) 段错误(Segmentation Fault)是C语言程序中常见的错误类型,它通常发生在程序尝试访问非法内存区域时。本文将深入探讨C语言段错误的原理,并分析其背后的技术原理。 段错误的定义 …

matlab人脸识别

在MATLAB中实现人脸识别通常涉及到图像处理、特征提取和分类器的使用。下面是一个简化的MATLAB人脸识别代码的概述,使用了PCA(主成分分析)作为特征提取方法,以及简单的分类器(如最近邻分类器)进行分类。请注…

无障碍Web开发:遵循WCAG标准构建包容性用户体验

无障碍Web开发旨在确保所有用户,无论其身体条件或能力如何,都能轻松、有效地访问和使用Web内容。遵循Web Content Accessibility Guidelines (WCAG) 标准是实现这一目标的关键。以下是一些基于WCAG标准的无障碍Web开发实践,以构建更具包容性的…

2024数维杯要点和难点,具体案例

2024数维杯,全称为2024年第九届数维杯大学生数学建模挑战赛,是由内蒙古创新教育学会主办的一项数学建模竞赛。该竞赛旨在培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力。以下是关于2024数维杯的一些关键信息: 竞赛时间&am…

Django 从零到一:Django环境设置

文章目录 安装 Python 3.11.0创建 Python 虚拟环境激活虚拟环境退出虚拟环境 配置 pip 国内源安装 Django 4.2本章小结 常言道:“工欲善其事,必先利其器”。我们先设置一下需要的环境。 我们使用的软件如下: Python 3.11.0Django 4.2Django…

UNXIU

外设可以对程序存储器和选项字节进行擦除和编程,不能对系统存储器进行操作,因为系统存储器是原厂写入的bootloader程序,不允许修改 对于C8T6程序存储容量是64K,一般写一个程序只占前边很小一部分空间,剩下的大部分空间…

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

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

面试 Java 并发编程八股文十问十答第十五期

面试 Java 并发编程八股文十问十答第十五期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)什么是锁的自适应…

Kubernetes 控制平面的安全管理

目录 1. API Server 安全2. etcd 安全3. 网络策略4. 日志与审计5. 定期安全检查与更新6. 云提供商安全集成 Kubernetes 控制平面的安全管理是维护整个集群稳定性和保护敏感信息的关键。控制平面主要包括 API Server、etcd、Controller Manager 和 Scheduler 组件。 1. API Ser…