【C++】const详解

news2025/1/10 23:58:07

📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文作为 JohnKi ,引用了部分大佬的案例
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 📢前言
  • 🏳️‍🌈const 的修饰范畴
    • ❤️1. 修饰一般常量和数组
    • 🧡2. 修饰指针
    • 💛3.修饰函数参数
    • 💚4. 修饰函数返回值
    • 💙5. 修饰成员函数
  • 🏳️‍🌈使用const的好处
  • 🏳️‍🌈const在C和C++中的区别


📢前言

  • C++ 中的 const 关键字的用法非常灵活,而使用 const 将大大改善程序的健壮性
  • const 是 C++ 中常见的类型修饰符,常类型是指使用类型修饰符 const 说明的类型,常类型的变量或对象的值是不能被更新的
  • const 名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。

🏳️‍🌈const 的修饰范畴

❤️1. 修饰一般常量和数组

int const a = 100;
const int a = 100; //与上面等价
int const arr [3] = {1,2,3};
const int arr [3] = {1,2,3};//与上面等价

🧡2. 修饰指针

char *p = "hello";     // 非const指针,非const数据

const char *p = "hello";  // 非const指针,const数据

char * const p = "hello";   // const指针,非const数据

const char * const p = "hello";  // const指针,const数据
  • 如果const位于星号*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

  • 如果const位于星号*的右侧,const就是修饰指针本身,即指针本身是常量。

💛3.修饰函数参数

const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型检查,并且在字符替换时可能产生意料不到的错误

void f(const int i){……}
//对传入的参数进行类型检查,不匹配进行提示

如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。

💚4. 修饰函数返回值

const 修饰函数返回值其实用的并不多,它的含义和 const 修饰普通变量以及指针的含义基本相同

1. const int func1();  //这个其实没多大意义,因为参数返回就是赋值
2. const int* func2(); //调用时:const int* p = func2(); 可以把 func2() 当作一个变量,即指针内容不可变
3. int* const func3(); //调用时:int* const p = func3(); 以把 func2() 当作一个变量,即指针本身不可变
  • 一般情况下,函数的返回值为某个对象时,如果将其声明为 const 时,多用于操作符的重载。通常,不建议用 const 修饰函数的返回值类型为某个对象或者某个对象的引用的情况。
  • 原因如下: 如果返回值为某个对象为 const(比如:const A test = A; )或某个对象的引用为 const(const A& test = A;),则返回值具有 const 属性,则返回实例只能访问类 A 中的公有或保护数据成员和 const 成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。

💙5. 修饰成员函数

const 修饰类的成员函数,则该成员函数不能修改类中任何非 const 成员函数,一般写在函数的最后来修饰

class A{
	void func() const{} 
	//常成员函数,它不能改变对象的成员变量,也不能调用类中任何非 const 成员函数
};

规则如下

  1. const 对象只能访问const 成员函数,非const 的对象可以访问任何成员函数,包括const 成员函数。
  2. 如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。
  3. const成员函数可以访问所有成员变量,但是只能访问const的成员函数。
  4. 非const成员函数,可以访问任何成员,包括const成员成员函数。
  5. onst成员函数不能修改任何的成员变量,除非变量用mutable修饰。

🏳️‍🌈使用const的好处

可以定义const常量
这样可以避免由于无意间修改数据而导致的编程错误,提供了一个保护作用。

便于进行类型检查
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

为函数重载提供了一个参考
const修饰的函数可以看作是对同名函数的重载。

可以节省空间,避免不必要的内存分配
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象宏一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而宏定义的常量在内存中有若干个拷贝。

提高了效率
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期的常量,没有了存储与读内存的操作,使得它的效率也很高。

🏳️‍🌈const在C和C++中的区别

  1. 在C语言中,用const修饰的变量,其本质上还是个变量,只是它不允许作为左值存在,也就是不法对该变量进行直接赋值修改该变量,但是这不意味着该变量的值就无法修改。

  2. 在C++中 ,在编译的时候,当碰到用const修饰的变量时,编译器是直接将变量的值和变量的符号对应起来一起存到符号表

  3. 例如const int a = 5;在符号表中就会将a和5对应起来,在编译的过程中,当碰到printf(“a = %d\n”,a); 时,用 5 直接将 a 替换掉。在C++中,编译器不会为a分配存储空间,在C语言中就会为a分配存储空间,所以在C编译器中,就可以通过指针来改变用const修饰的变量

  4. 其实在C++中,const修饰的变量,在编译的时候如果前面有extern和取地址符 & 时,会为变量分配存储空间是为了兼容C语言,但是在C++中,用const修饰的变量就真的无法修改它的值,可以说是常量。但是在C语言中,const修饰的变量本质上还是变量而不是常量。这在C语言中其实也是矛盾的,因为我们想要用const定义一个常量,但又可以通过指针来改变该常量的值。而C++为了兼容C语言,所以保留了这个特性,但是却无法修改它的值,这就是const在C语言和C++中的区别。


本篇博文对 const 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

请添加图片描述

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

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

相关文章

【Kali-linux for WSL】图形化界面安装

文章目录 前言图形化界面安装 前言 之前在WSL中安装了Kali 启动之后发现什么都没有!!! 那我还怎么学习渗透技术??? 看来,得改进下我的kali-linux for wsl,安装个图形化界面 图形化…

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-Transformer-LSTM多变量回归预测,贝叶斯优化Transformer结合LSTM长…

【Python】Python中的常量与变量

常量与变量 导读一、新建项目二、常量2.1 字面常量2.2 特殊常量 三、变量3.1 变量的定义3.2 变量的命名3.2.1 关键字 结语 导读 大家好,很高兴又和大家见面啦!!! 在上一篇内容中我们详细介绍了Python环境的搭建过程,…

一键转换,高效管理:引领文件批量改后缀名与TXT转DOCX格式新潮流

在这个数字化时代,文件管理和格式转换成为了我们日常工作中不可或缺的一部分。然而,手动更改文件后缀名以及将TXT文件转换为DOCX格式,不仅耗时耗力,还容易出错。幸运的是,我们有了文件批量改名高手这款强大的工具&…

【JAVA多线程】JDK中的各种锁,看这一篇就够了

目录 1.概论 1.1.实现锁的要素 1.2.阻塞队列 1.3.Lock接口和Sync类 2.各种锁 2.1.互斥锁 2.1.1.概论 2.1.2.源码 1.lock() 2.unlock() 2.2.读写锁 2.3.Condition 2.3.1.概论 2.3.2.底层实现 1.概论 1.1.实现锁的要素 JAVA中的锁都是可重入的锁,因为…

固定网国内数据传送业务经营许可证

一、国内固定网数据传送业务是什么? 固定网国内数据传送业务是指互联网数据传送业务以外的,在固定网中以有线方式提供的国内端到端数据传送业务。主要包括基于IP承载网、ATM网、X.25分组交换网、DDN网、帧中继网络的数据传送业务等。该业务属于A2类基础…

数字源表表征及测试纳米材料高温原位方案

01/纳米材料电学性能的表征和分析/ 与传统的材料相比,纳米材料具有原子级厚度、表面平整无悬空键、载流子迁移率好等优点,其导电性能很大程度依赖于材料本身的带隙、掺杂浓度和载流子迁移率。同样的掺杂浓度下,迁移率越大,电阻率…

计算机网络--网络层

一、网络层的服务和功能 网络层主要为应用层提供端对端的数据传输服务 网络层接受运输层的报文段,添加自己的首部,形成网络层分组。分组是网络层的传输单元。网络层分组在各个站点的网络层之间传输,最终到达接收方的网络层。接收方网络层将运…

nginx SSI(Server Side Include)服务端包含 合并拼装静态内容

一、什么是SSI 在被传送给浏览器之前,服务器会对 HTML 文档进行完全地读取、分析以及修改,使用SSI指令将文本、图片或代码信息包含到网页中。对于整个页面可以拆分成多个模块,通过SSI指令将几个模块拼接成一个完整的页面,当有内容…

大模型在软件测试领域的应用场景有哪些?_大模型在测试领域应用

在数字化转型的大背景下,在软件定义一切的趋势下,软件测试人员需要接触和理解的信息越来越多,并呈现加速增长的态势。需求越来越大,交付周期越来越短,受制于体力和能力限制,测试人员的效率和质量难以同步提…

基于模式识别的垃圾分类系统-计算机毕业设计源码96151

摘 要 随着城市化进程的加速和人口的不断增长,垃圾管理和环境保护成为了全球面临的重要挑战之一。垃圾分类作为一种可行的解决方案,旨在减少垃圾的数量、降低环境污染,并促进资源的回收与再利用。 本文旨在设计并开发一个垃圾分类系统。该系统…

电工电子革新风暴:在线电路仿真软件重塑行业格局

随着科技的不断进步,电工电子行业正迎来一场由在线电路仿真软件引领的革新风暴。这些功能强大的软件工具不仅极大地提高了电路设计的效率,更为整个行业带来了前所未有的冲击和机遇。 仿真软件:电工电子行业的“隐形推手” 在线电路仿真软件…

代码随想录算法训练营第42天| 198.打家劫舍、213.打家劫舍II 337.打家劫舍III、 337.打家劫舍III

198.打家劫舍 题目链接:198.打家劫舍 文档讲解:代码随想录 状态:不会 记忆化搜索思路: 可以从最后一间房子开始,每次面对一个房子要考虑打劫还是不打劫,如果打劫了就从它的下下个房子开始打劫,在…

idea Git操作

1、代码拉取(左上角) 或 2、代码push(左上角) 3、切换分支(右下角) 4、分支管理 5、当前分支和某一个分支对比差异 6、当前分支某一个提交需要恢复成提交前状态(revert) 7、其他分…

Python处理浮点数的实用技巧

更多Python学习内容:ipengtao.com 四舍五入是一种常见的数学操作,它用于将数字舍入到指定的精度。Python 提供了多种方法来实现四舍五入操作,从基本的 round 函数到高级的 decimal 模块,满足不同的需求。本文将详细介绍这些方法&a…

Profibus DP主站转Modbus网关连接伺服与电机通讯

在工业自动化领域,将Profibus DP主站转Modbus网关(XD-MDPBM20)用于连接伺服与电机通讯是一种常见且重要的应用方式。当使用Profibus DP主站转Modbus网关(XD-MDPBM20)连接伺服与电机进行通讯时,可以参考以下…

使用代理,在Mapper层面统一封装VO、Entity 之间的转换逻辑

无聊看看开源项目,无意间看到里面的业务代码用到了BaseMapperPlus,于是点进去发现里面封装了Vo、Entity 之间的转换逻辑。想着自己平时都是手动的进行 copy 转换来着。于是本地进行验证了一番,发现还挺好用的,懒人必备。但是前提是…

MySQL 9.0 悄悄上线,支持面向AI的向量数据库

MySQL狂热粉丝群已经发现MySQL官网上MySQL9.0这两天悄然上线,已经可以下载体验了,目前被定义为创新版本(Innovation)。 下载地址:https://dev.mysql.com/downloads/mysql/ 支持主流的操作系统,安装后可以直…

101 个现实世界的新一代 AI 用例

自从一年半前生成式人工智能首次引起世界关注以来,人们一直在热烈讨论这项新技术的最佳用途。虽然我们都喜欢早期的有趣聊天和诙谐的打油诗,但我们很快发现,许多最大的人工智能机会显然都在企业中。 短短几个月内,这些组织就从 A…

tcp/ip, http 等协议的端口号

每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人. 在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议…