C++中const关键字的用法

C语言和C++中const的不同

        首先我们需要区分一下C语言中的const和C++中的const,C语言中的const修饰的变量可以不初始化,但如果将一个变量定位为const类型还不初始化,那么之后就不能对这个变量直接赋值了。

        如果我们使用C语言中的const定义的变量指定数组的大小,那么就会直接报错,因为数组大小的初始化必须是一个常量,实际上在C语言中,const确实不是用来定义一个常量的,而是用来定义一个常变量的,只是这个变量的值不能被直接修改(通过指针还是可以修改这块内存的值的),除此之外这个变量和其他的C语言的变量没什么区别,甚至连编译生成指令的方式都是一样的。

        但是在C++中,const就是真正用来定义一个常量的,不进行初始化就会直接报错。

        这主要是因为常量的编译方式和变量的编译方式不同,常量在编译阶段会将整个程序中这个常量的名称都替换为这个常量的值,那么如果你在定义一个常量的时候,还不进行初始化的话,编译器就不知道要替换为什么值,自然就会直接报错了。

        用C++中的const修饰的变量可以初始化数组的大小,也说明了这个变量实际上是一个常量。

 

         当然了既然已经用const修饰作为常量了,那么这个变量就不能作为左值来使用了,毕竟你不能修改一个常量的值嘛。

        如果你按照下面这种方式在C++中定义一个const类型的变量,那么这个变量就直接退化为了C语言中的常变量了。

	int a = 10;const int p = a;return 0;

C++中的const配合一级指针使用 

 一般来说,在C++中const配合一级指针使用有四种形式。

	const int *pint const* p;int* const p;const int* const p;

const的修饰作用

那么很多人其实分不清这上面四种const用法所产生的效果,实际上,在C++中const修饰的是离它最近的类型。

比如const int *p,这个const显然修饰的是int类型,也就是*p,p本身是一个int*类型的,*p就是int类型嘛,代表*p不能被改变。

int const *p,这个const离int最近,所以也是修饰int类型,同样是*p,代表*p不能被改变,也就是指针所指向的值不能改变。

int *const p的const就是离int *最近了,所以修饰的是int*类型,也就是p,代表p所指向的地址不能改变。

const int * const p有两个const,离第一个const最近的是int,离第二个const最近的是int *,所以第一个const修饰的是*p,代表*p不能改变,第二个const修饰的是p,代表p不能改变,所以呢,这个指针所指向的值不能被修改,指向的地址也不能被修改。

const的类型转换

对于const的类型转换,我们需要知道一个原则,那就是const的右边如果没有指针符号的话,const不参与类型之中。

	int* q;int* const p;const int* w;

int *q的类型是int *,int *const p的类型也是int *,因为const的右边没有*号,所以const不参与类型中,而const int *w的类型就是const int*了,因为const的右边存在*号。

另外呢,从int *是可以转换到const int *的,但是const int *不能转换为int *,否则不就代表你可以修改这个指针所指向的值了吗。

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

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

相关文章

c++ 21 指针

*像一把钥匙 通过钥匙去找内存空间 间接修改内存空间的值 不停的给指针赋值 等于不停的更改指针的指向 指针也是一种数据类型 指针做函数参数怎么看都不可以 指针也是一个数据类型 是指它指向空间的数据类习惯 作业 野指针 向null空间地址copy数据 不断改变指针指向 …

将本地微服务发布到docker镜像二:

上一篇文章我们介绍了如何将一个简单的springboot服务发布到docker镜像中,这一篇我们将介绍如何将一个复杂的微服务(关联mysql、redis)发布到docker镜像。 我们将使用以下两种不同的方式来实现此功能。 redis、mysql、springboot微服务分开…

Redis未授权访问漏洞 *

#安装redis apt-get install redis #redis链接 redis-cli -h 192.168.4.176 -p 6379 #redis常见命令 (1)查看信息:info (2)删除所有数据库内容:flushall (3)刷新数据库:f…

平衡二叉树 - 力扣(LeetCode) C语言

110. 平衡二叉树 - 力扣(LeetCode)(点击前面链接即可查看题目) 一、题目 给定一个二叉树,判断它是否是 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。 示例 1: 输入:root […

unity拖拽物品遇到的bug及解决思路

记录一下拖拽实现过程中遇到的bug RectTransform 专门用在UI中transform 判断点击是否在UI中 使用这个函数就可以判断点击的是否是UI面板,返回true表明在UI面板中 EventSystem.current.IsPointerOverGameObject()值得一提的是,如果发现了有UI穿透效…

【Material-UI】多选模式(Multiple values)与Autocomplete的高级用法解析

文章目录 一、多选模式的基本用法二、高级用法1. 固定选项(Fixed options)2. 复选框(Checkboxes)3. 限制标签显示数量(Limit tags) 三、性能优化与最佳实践1. 筛选已选项(filterSelectedOptions…

乡村振兴建设顶层规划建设方案

数字乡村振兴平台顶层规划方案摘要 1. 政策背景与总体要求 政策背景:党的十九大明确提出实施乡村振兴战略,总体要求包括产业兴旺、生态宜居、乡风文明、治理有效和生活富裕。随后,中央一号文件、乡村振兴战略规划以及十四五规划和2035年远景…

C# 设计模式之装饰器模式

总目录 前言 装饰器模式的主要作用就是扩展一个类的功能,或给一个类添加多个变化的情况。学习面向对象的都知道,如果想单纯的给某个类增加一些功能,可以直接继承该类生成一个子类就可以。应对一些简单的业务场景继承也就够了,但是…

共享`pexlinux`数据文件的网络服务

实验环境准备: 1.红帽7主机 2.要全图形安装 3.配置网络为手动,配置网络可用 4.关闭vmware DHCP功能 一、kickstart自动安装脚本制作 1.安装图形化生成kickstart自动脚本安装工具 2.启动图形制作工具 3.图形配置脚本 这里使用的共享方式是http&#xff0…

2024靠这份软件测试面试题宝典已成功上岸,跳槽成功

上月很多朋友靠这份面试宝典拿到大厂的office,跳槽成功,面试找工作的小白和要跳槽进阶都很适合,没有一点准备怎么能上岸成功呢? 这份面试题宝库,包含了很多部分:测试理论,Linux基础&#xff0c…

每日OJ_牛客WY15 幸运的袋子

目录 牛客HJ62 查找输入整数二进制中1的个数 解析代码 牛客HJ62 查找输入整数二进制中1的个数 查找输入整数二进制中1的个数_牛客题霸_牛客网 解析代码 本题是计算一个数二进制表示中1的个数,通过(n >> i) & 1可以获取第i位的二进制值&…

Linux中安装C#的.net,创建运行后端或控制台项目

安装脚本命令: 创建一个sh文件并将该文件更改权限运行 sudo apt update wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get upd…

【文件系统】抽象磁盘的存储结构 CHS寻址法 | sector数组 | LAB数组

目录 1.为什么要抽象 2.逻辑抽象_版本1 2.1sector数组 ​2.2index转化CHS 3.逻辑抽象_版本2 3.1LBA数组 3.2LAB下标转化sector下标 文件其实就是在磁盘中占有几个扇区的问题❗文件是很多个sector的数组下标❗文件是有很多块构成的❗❗文件由很多扇区构成------>文件…

PXE+Kickstart自动化安装RHEL7.9

准备环境 1. 一台RHEL7.9主机 2. 开启主机图形 如果是7.9的主机是图形化界面了 就输入命令init 5 开启图形 如果主机一开始没装图形化界面,可以使用以下命令安装 # yum group install "Server with GUI" -y 3. 配置网络可用 4. 关闭VMware dhcp功…

音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现

音视频入门基础:WAV专题系列文章: 音视频入门基础:WAV专题(1)——使用FFmpeg命令生成WAV音频文件 音视频入门基础:WAV专题(2)——WAV格式简介 音视频入门基础:WAV专题…

IJCAI 2024 | 时空数据(Spatial-Temporal)论文总结

2024 IJCAI(International Joint Conference on Artificial Intelligence, 国际人工智能联合会议)在2024年8月3日-9日在韩国济州岛举行。 本文总结了IJCAI2024有关时空数据(Spatial-temporal) 的相关论文,如有疏漏,欢迎大家补充。…

给水排水杂志

一、基本信息 《给水排水》创刊于1964年,是国内创刊早、发行量大、内容涵盖广的水行业权威期刊,在业内享有盛誉。期刊现由中国建设集团股份有限公司主管,亚太建设科技信息研究院有限公司、中国土木工程学会主办。现任名誉主编&#xff1a…

SDXL总结

SDXL base部分的权重:https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main diffusers库中的SDXL代码pipelines: https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/stable_diffusion_xl 参考&…

目标跟踪那些事

目标跟踪那些事 跟踪与检测的区别 目标跟踪和目标检测是计算机视觉中的两个重要概念,但它们的目的和方法是不同的。 目标检测(object Detection):是指在图像或视频帧中识别并定位一个或多个感兴趣的目标对象的过程 。 目标跟踪(object Tracking)&…

力扣爆刷第169天之TOP200五连刷111-115(课程表、单词搜索、归并)

力扣爆刷第169天之TOP200五连刷111-115(课程表、单词搜索、归并) 文章目录 力扣爆刷第169天之TOP200五连刷111-115(课程表、单词搜索、归并)一、207. 课程表二、LCR 125. 图书整理 II三、402. 移掉 K 位数字四、79. 单词搜索五、9…