C/C++程序设计——const关键字

news2024/7/6 19:52:29

1.修饰变量

1.1 作用

功能:不能直接被修改

        const修饰变量,就相当于是定义了一个常量。该变量不能直接被修改,但是可以通过指针修改。

作用:便于维护、提前发现可能错误的修改

        比如程序中大量使用了一个数字10,且不会对其修改,就可以将其定义为const常量,这样若其他地方对其进行了直接修改,编译阶段就会报错;且以后如果要改变这个数字,那么只需要改变定义时这一个地方就可。

1.2 修饰局部变量

(1)C环境下

(2)C++环境下(常量折叠)

在C++环境下,我们运行同上代码:

        我们发现通过指针修改后, val还是输出的10,*p输出的是20,两个的地址也是一样的,但输出值不同,这是什么原因?

常量折叠:

        这就是C++中的常量折叠:const变量(即常量)值,会被存放到编译器的符号表中,参与计算时直接从符号表中取出数据,省去了内存访问的操作,这就是编译器进行的一种优化。编译器在预处理的时候,就对const变量val进行了替换(只读取了这一次),所以输出的是原先的10,而*p指向的是val的存储空间,也实际改变了val存储的数据,所以输出的是20。

const修饰的局部变量:是存储在栈区中。

解决方法:

        使用volatile关键字修饰该变量,保持变量的内存可见性,这样每次访问该变量内容时,都会通过内存去获取。

 

1.3 const修饰全局变量(C/C++)

        上述内容是在局部const变量条件下,若const修饰的是全局变量,再通过指针去修改,则会引发异常,写入访问权限冲突,也就是不可写。

原因:const修饰的全局变量存储在内存的全局区中,其只有可读属性,无法修改。

2.修饰指针

2.1 指针常量

指针常量:const修饰指针变量名

        表示指针的指向不能被修改,但是指向的内容可以被修改。

2.2 常量指针

常量指针:const修饰*

        表示指针指向的内容不能被修改,但是指针的指向可以修改。

注意:

        当然也可以利用两个const分别修饰*和指针变量名,表示该指针的指向和指向的内容都不能被修改。

 

3.修饰数组

        表明数组中的每个元素都是const属性,其特性同上。

4.修饰函数形参

(1)void func(const int val);

        形参不能被修改。

(2)void func(const int* val);

        指针形参指向的内容不能被修改,因为实参和形参指向的是同一个地址,所以可以防止函数内部通过形参进行修改其指向内容,起到保护实参指向内容的作用。

(3)void func(int* const val);

        指针形参的指向不能被修改。

(4)void func(const int& val);(C++)

        引用实体无法被修改,保护实体。注意:const放到&符号后不起作用。

注意:const实参不能传递给非const形参;非const实参可以传递给const形参。

5.修饰函数返回值

5.1 修饰普通类型返回值

        没有意义,因为返回的本身就是一个临时变量,具有常量性。

5.2 修饰指针类型返回值

(1)const修饰*

        不能将权限放大,所以不能赋值给非const属性变量。

(2)const修饰指针变量名(在*后面)

        此时可以将其赋值给非const变量,因为此时指针指向的内容可以被修改,将其赋值给非const变量后,也可以对其指向的内容进行修改,并没有放大对指向内容的访问权限。

5.3 修饰引用类型返回值(C++)

        同样只能赋值给const类型引用,表示不能对引用实体进行修改。

6.修饰类的成员变量(C++)

        const修饰类的成员变量,表示其为成员常量,不能被修改,且只能在初始化列表进行初始化。(注:C++98和11中,也支持了声明时初始化,但还是推荐使用初始化列表进行初始化)

7.修饰类的成员函数(C++)

        const修饰的类成员函数称为const成员函数,本质上const修饰的是该成员函数隐藏的this指针,表示在该函数内,不能对类的任何成员进行修改

this本身的类型:Time* const this

const修饰后:const Time* const this

        相当于this本身的指向就是不能被修改的,通过const成员函数的const修饰后,其指向的内容也不能被修改。

相关问题:

(1)const对象能否调用非const成员函数?

        不能,const类型对象只能调用const成员函数,不能调用普通成员函数。因为普通成员函数可能会对对象中的成员进行修改。

(2)非const对象能否调用const成员函数?

        可以,普通对象对于普通成员函数和const成员函数都可以调用。

(3)const成员函数内,能否调用其他的非const成员函数?

        不能,同理非const成员函数可能会对对象的成员进行修改,而const成员函数内不能对对象的任何成员进行修改。

(4)非const成员函数内,能否调用其他的const成员函数?

        可以。

注意:

        构造函数,拷贝构造函数,析构函数,赋值运算符重载,不可以使用const修饰。因为以上四个函数目的就是对成员进行修改。

mutable关键字:
        mutable关键字修饰成员变量,表示该成员变量可以在const修饰中被修改。
 

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

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

相关文章

GaussDB工作级开发者认证—第一章GaussDB数据库介绍

一. GaussDB概述 GaussDB是华为基于openGauss自研生态推出的企业级分布式关系型数据库。具备企业级复杂事物混合负载能力,同时支持分布式事务强一致性,同城跨AZ部署,数据0丢失,支持1000的计算节点扩展能力,4PB海量存储…

springcloud2.1.0整合seata1.5.2+nacos2.10(附源码)

springcloud2.1.0整合seata1.5.2nacos2.10(附源码) 1.创建springboot2.2.2springcloud2.1.0的maven父子工程如下,不过多描述: 搭建过程中也出现很多问题,主要包括: 1.seataServer.properties配置文件的组…

安全配置管理 (SCM):建立安全的基础

通过确保在端点中建立和维护理想的安全配置,让自己在安全的基础上做好准备,这样公司就不会因单个漏洞而分崩离析。安全配置管理涉及持续检测端点中各个组件之间的配置偏差和错误配置,并使它们重新对齐。 在本文中,将了解 Vulnera…

<Linux开发> linux应用开发-之-进程通信之管道例程

一、简介 所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称 pipe 文件。 向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数…

Windows串口出厂测试工具与使用说明

WCHUsbSerTest是一款用于WCH USB转串口系列产品出厂测试的工具软件,方便用户对产品进行批量化功能测试。该软件支持以下特性: 支持设备热插拔检测,插入自动测试。支持两种测试模式:1个设备自测、2个设备互相连接测试。支持多种串…

VMware Horizon 8 2303 - 虚拟桌面基础架构 (VDI) 和应用软件

请访问原文链接:https://sysin.org/blog/vmware-horizon-8/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Version2303DocumentationRelease NotesRelease Date2023-03-30 虚拟桌面基础架构 (VDI) 和应用软件 VMw…

chagpt中文镜像版-ChatGPT工具下载

ChatGPT工具下载 ChatGPT是由OpenAI公司开发的预训练语言模型,目前已经开源并在GitHub上发布了相关代码和模型,提供了使用Python编写的API。如果您要使用ChatGPT,您可以通过以下步骤进行下载和安装: 在GitHub上下载:您…

【vue】 vue2 中使用 Tinymce 富文本编辑器

文章目录Tinymce 效果一、安装依赖二、封装组件-Tinymce.vue三、汉化文件-zh_CN.js四、vue使用组件封装五、整体目录结构六、可能会遇到的问题import "tinymce/icons/default" 路径找不到需要升级tinymce版本Tinymce 效果 一、安装依赖 npm i tinymce5.1.0 -S npm i…

计算机组成原理实验一(完整)

在VC中使用调试功能将下列语句运行的内存存放结果截图&#xff0c;每运行一句需截图一次。 #include<stdio.h> int main() {int a 你的学号末两位-100; //0x&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#x…

【Redis 进阶之路】3. Redis 主从 以及哨兵

Redis 主从 以及哨兵 单实例Redis 不足&#xff1a; 上述的是一个单实例的Redis。 我们可以先分析下有哪些不足&#xff1a; 单点故障 &#xff08;是每个单实例必须面对的问题&#xff09;容量有限 &#xff08;Redis毕竟是缓存型数据库&#xff0c;容量取决于服务器分配的容…

多目标优化算法评价指标(performance metrics)

参考Performance metrics in multi-objective optimization​​​​​​​ Riquelme, N., Lcken, C. V., & Baran, B. (2015, 19-23 Oct. 2015). Performance metrics in multi-objective optimization. Paper presented at the 2015 Latin American Computing Conference…

SpringBoot整合ES 实现简单项目(七)

一直在烂尾&#xff0c;对&#xff0c;说的就是你&#xff0c;楼. 上一章简单介绍了 SpringBoot 整合 ES (六), 如果没有看过,请观看上一章 这一章节老蝴蝶做一个简单的 ES 查询项目 一. pom.xml 添加依赖 <!--引入MySql的驱动--><dependency><groupId>mys…

小林coding——图解MySQL

文章目录基础篇执行一条select语句&#xff0c;期间发生了什么&#xff1f;MySQL一行记录是怎么存储的&#xff1f;索引篇索引常见面试题什么是索引&#xff1f;索引的分类&#xff1f;小结从数据页的角度看B树为什么MySQL采用B树作为索引&#xff1f;MySQL单表不要超过2000W行…

ElasticSearch分片与Lucene Index

在ES中一个索引有一个或者多个分片构成&#xff0c;在创建索引的时候可以设置主分片和副本分片的数量&#xff0c;当主分片确定之后就不可以再修改了(因为路由需要基于这个数量来分发请求)&#xff0c;而副本分片数量随时可以修改 PUT /myIndex {"settings" : {&quo…

使用ensp软件模拟DNS服务器实验

DNS服务器介绍&#xff1a; DNS服务器&#xff08;Domain Name Server&#xff0c;域名服务器&#xff09;是进行域名和与之相对应的IP地址进行转换的服务器。它起到将人类易于记忆的域名映射到相应的机器可识别的IP地址的作用。 DNS服务器中保存了一张域名和与之相对应的IP地…

Flutter 中 Provider 基本使用

前言&#xff1a; Provider.of<XXX>(context).数据 Provider.of<XXX>(context).方法 ChangeNotifier&#xff1a;这个是真正数据&#xff08;状态&#xff09;存放的地方。我们自己创建的provider 是混入ChangeNotifier 的。 一 安装 在pub.dev 上搜索provider …

2.技巧※(0x3f:从周赛中学算法 2022下)

来自0x3f【从周赛中学算法 - 2022 年周赛题目总结&#xff08;下篇&#xff09;】&#xff1a;https://leetcode.cn/circle/discuss/WR1MJP/ 技巧指一些比较套路的算法&#xff0c;包括双指针、滑动窗口、二分&#xff08;主要指二分答案&#xff09;、前缀和、差分、前后缀分解…

TypeScript由浅到深(下篇)

目录 七、TypeScript泛型编程 泛型实现类型参数化: 泛型接口和泛型类的使用: 泛型约束: 映射类型: TypeScript条件类型&#xff08;Conditional Types&#xff09;: 在条件类型中推断&#xff08;inter&#xff09;: 分发条件类型&#xff08;Distributive Conditional …

【Java基础】day15

day15 一、为什么需要使用多线程&#xff1f; 1、资源利用率提升&#xff0c;程序处理效率提高 2、软件运行效率提升 3、使用线程可以把占据时间长的程序中的任务放到后台去处理 4、充分利用 CPU 资源&#xff0c;多核 CPU 的情况下会更高效 二、Spring Boot 的启动流程&…

搭建个人网站没有公网IP地址可以吗?

搭建网站不一定需要公网IP地址&#xff0c;甚至都不需要云服务器或虚拟主机。可以先在本地个人电脑中搭建一个网站&#xff1b;然后网站需要为公网上的其他访客提供访问&#xff1b;所以&#xff0c;需要内网穿透&#xff0c;映射公网域名进行访问。但是完全没必要&#xff0c;…