【C++】const关键字的详解!!

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 引用:
  • 一、const修饰范围
  • 二、const修饰指针,常量,
    • 1.情况一
    • 情况二
    • 情况三
  • 三、修饰类的成员函数
    • 1.格式:
    • 2.为什么要使用const修饰成员函数?修饰的是谁?
    • 3.函数访问时的权限问题

引用:

const关键字是永恒不变的意思,用它修饰的关键字只具有度的特性,没有办法进行写操作。const常变量只在编译期有用,在运行期无用,可以很好的增加程序的健壮性,防止一些不必要的变量被错误修改引发的程序问题。const修饰的变量是只读的,本质还是变量。

现代C编译器(如Vc、gcc)中的const将具有全局生命周期(如全局变量,static属性的变量)存储于只读存储区,修改该变量时将导致程序崩溃。【注意】标准C语言编译器(如bcc)不会被const修饰的全局变量存储于只读存储区,而是存储于可修改的全局数据区,其值依然可以改变。

一、const修饰范围

(1)定义常量,和define语句类似。但是相比较而言,使用const在很多编译器中是不会给分配空间的,这样可以大大减少内存的使用量。

(2)const修饰函数形参。const类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有const类型的变量,那么该变量必须在类的初始化列表中进行初始化;

(3)const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值。

(4)修饰函数返回值。参数可以直接赋值给一个常量或者指针。const修饰函数返回值表示返回值不可改变,多用于返回指针的情形。

(5)修饰成员函数,形参后加const,其实是用来修饰this。来保证this的成员变量不可变。

二、const修饰指针,常量,

1.情况一

首先,我们要清楚, int* const pa = &a;中的pa是一个指针,而*pa是指针的解引用,是指针指向的值。

int* const pa = &a;

在这里插入图片描述
可以发现【pa = &b;】直接对pa的内容修改是不行的。但是【*pa = b;】可以通过指针去修改其内容。也就是说,const此时修饰的是pc

情况二

const int *pa = &a;
在这里插入图片描述
可以发现【pa = &b;】直接对pa的内容修改是可以的。但是【*pa = b;】不可以通过指针去修改其内容。也就是说,const此时修饰的是*pa

情况三

int const* pa = &a;
在这里插入图片描述
结果证明,这种const所处位置造成结果与情况二一致。

三、修饰类的成员函数

1.格式:

void Print() const{}

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print() const{cout << "Print()" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}
private:int _year; // 年int _month; // 月int _day; // 日
};

这里的const修饰形参中的隐藏参数相当于Date *const this。

2.为什么要使用const修饰成员函数?修饰的是谁?

答:(1)首先我们要清楚,类的成员函数中才会存在this指针。this指针是一个指向当前对象的指针,只有在成员函数中才有定义。this指针一般都是隐藏的,存在于形参列表的最左边。
(2)const修饰this指针指向的对象,这也就保证调用这个const成员函数的对象在内部不会被改变

注意:

  • 非成员函数,没有this指针,不能使用const修饰。

总结,如果成员函数不需要修改成员变量,最好加上const。反之,如果成员函数需要修改成员变量,那么久不能加const。cosnt修饰*this。

3.函数访问时的权限问题

允许原则: 权限平移,权限缩小,不能权限放大。

  • 非const对象都可以访问const对象,权限缩小。
  • const对象可以访问const对象,权限平移。
  • const对象不能访问非const对象,会造成权限放大。

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

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

相关文章

Android MVVM+coroutine+retrofit+flow+hilt

文章目录 Android MVVMcoroutineretrofitflowhilt概述依赖注入层数据层视图层模型视图层代码下载 Android MVVMcoroutineretrofitflowhilt 概述 代码结构&#xff1a; 依赖注入层 数据库&#xff1a; Module InstallIn(SingletonComponent::class) class DBModule {Singleto…

数据结构与算法-D2D3线性表之顺序表

线性表&#xff1a;包含若干数据元素的一个线性序列&#xff0c;特征如下&#xff1a; 1&#xff09;对非空表&#xff0c;a0是表头&#xff0c;无前驱&#xff1b; 2&#xff09;an-1是表尾&#xff0c;无后继&#xff1b; 3&#xff09;其他元素仅且仅有一个前驱&#xff0c;…

【PTA题目】6-1 猴子吃桃-递归 分数 10

6-1 猴子吃桃-递归 分数 10 全屏浏览题目 切换布局 作者 ZZULI 单位 郑州轻工业大学 小猴子第一天摘下桃子若干&#xff0c;当即吃掉一半&#xff0c;还不过瘾&#xff0c;又多吃一个&#xff0c;第二天又将剩下的桃子吃掉一半多一个&#xff0c;以后每天吃掉前一天剩下的一…

完美洗牌问题学习笔记

问题背景 完美洗牌&#xff1a;一副 52 张的排序好的扑克牌&#xff0c;从中间分为两半&#xff0c;每部分各 26 张。假设每次都分为左右两部分&#xff0c;然后将 右部分的牌和左部分的牌按顺序交错穿插&#xff0c;每张左部分牌后面加入一张右部分的&#xff0c;依序加入所有…

基于YOLOv8深度学习的120种犬类检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战、狗类检测、犬种识别

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【“C++ 精妙之道:解锁模板奇谭与STL精粹之门“】

【本节目标】 1. 泛型编程 2. 函数模板 3. 类模板 4. 什么是STL 5. STL的版本 6. STL的六大组件 7. STL的重要性 8. 如何学习STL 9.STL的缺陷 1. 泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;lef…

odoo自定义提示性校验

背景: 在odoo16的原生的代码里&#xff0c;可以给按钮添加一个 confirm属性&#xff0c;从而达到 提示性校验的效果。 问题&#xff1a; 这个属性加了之后一定会弹出提示性校验的对话框&#xff0c;于是如何根据我们的实际业务&#xff0c;从后端返回提示性信息&#xff0c;…

5.2k Star!一个可视化全球实时天气开源项目!

大家好&#xff0c;本文给大家推荐一款全球实时天气开源项目&#xff1a;Earth。 项目简介 Earth 是一个可视化全球天气实况的项目。该项目以可视化的方式展示了全球的天气情况&#xff0c;提供了风、温度、相对湿度等多种天气数据&#xff0c;以及风、洋流和波浪的动画效果…

CSES-1632 | Movie Festival II

CSES - 1632 Movie Festival II 原题链接分析程序代码 原题链接 CSES - 1632 Movie Festival II 分析 这题需要用到贪心的策略&#xff0c;即先结束的电影先安排&#xff0c;这样才能看尽可能多的电影。这题可以归类为区间问题&#xff0c;先按照结束时间对区间进行升序排序…

关于mysql的lower_case_table_names引发的思考

lower_case_table_names设置大小写敏感的三个值0、1、2的区别&#xff1f; lower_case_table_names参数详解 1.参数说明&#xff1a; lower_case_table_names 0 表名 存储为给定的大小和比较是区分大小写的lower_case_table_names 1 表名 存储在磁盘是小写的 &#xff0c;但…

2-1、地址加法器CS:IP

语雀原文链接 文章目录 1、CPU组成2、通用寄存器16位寄存器的存储16位寄存器兼容8位word 和 byte进位问题 3、地址加法器不同的段地址和偏移地址表示同一个物理地址偏移地址的范围一个段的起始地址一定是16的倍数 4、CS:IPCS IP工作过程jmp修改CS:IP 5、DS和[address]DS和[add…

蓝桥杯算法心得——仙界诅咒(dfs)

大家好&#xff0c;我是晴天学长&#xff0c;搜索型的dfs&#xff0c;差点开二维矩阵了&#xff0c;仔细一想&#xff0c;没那么夸张啊&#xff0c;哈哈哈&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1…

性能工具之JMeter二次开发总结

文章目录 一、前言二、自定义脚本三、自定义请求编写&#xff08;Java Sampler&#xff09;四、自定义函数五、小结 一、前言 掌握 JMeter 的脚本编写和执行&#xff0c;这基本已满足大部分的性能测试需求&#xff0c;但是面对各种各样的项目技术方案&#xff0c;有些需求是需…

mybatis多表查询(xml)

多表查询都用resultMap resultMap 说白了就是他可以手动设置映射参数&#xff0c;例如 可以指定 column代表数据库的参数 property 代表实体类的参数 <id column"roleid" property"id"></id> column代表数据库的参数 property 代表实体类…

【隐私计算】安全三方计算(3PC)的加法和乘法计算协议

ABY3中采用replicated secret sharing&#xff08;复制秘密分享&#xff09;机制&#xff0c;即2-out-of-3秘密分享&#xff0c;三个参与方的每一方都拥有share中的两份。下面来看一下这样做有什么好处。 2-out-of-3秘密分享 有 x , y x, y x,y两个操作数&#xff0c;先进行秘…

列表插槽使用

{label: 是否展示,prop: isShow,solt: true, }<!--自定义列 展示 1 不展示 0 --><template slot-scope"scope" slot"display"><div style"color: red;cursor: pointer"><el-switch v-model"scope.row.display" :…

在gitlab中使用gitlab-sshd替换ssh服务

参考&#xff1a;https://docs.gitlab.com/ee/administration/operations/gitlab_sshd.html 说明 gitlab-sshd 是 OpenSSH 的轻量级替代品&#xff0c;用于提供 SSH 操作。虽然 OpenSSH 使用受限的 shell 方法&#xff0c;但 gitlab-sshd 的行为更像是一个现代的多线程服务器应…

记录 | CUDA编程中声明内联函数的方法

下面将 say_hello() 声明为内联函数&#xff1a; #include <cstdio> #include <cuda_runtime.h>__device__ __inline__ void say_hello(){printf("Hello, world!\n"); }__global__ void kernel(){say_hello(); }int main(){kernel<<<1, 1>&…

Rust中由于错误使用锁引发的问题,单线程中的死锁现象【已解决】

问题描述&#xff1a;事情是这样的&#xff0c;我的程序在运行一个方法&#xff0c;运行到末尾&#xff0c;发现卡住了。   问题排查&#xff1a;我想这代码也没涉及到其他锁的获取啊&#xff0c;怎么会跑不动了呢&#xff0c;通过阅读代码发现&#xff0c;我创建了一个 Arc&…

ssm的网上奶茶店系统(有报告)。Javaee项目。

演示视频&#xff1a; ssm的网上奶茶店系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybat…