当前位置: 首页 > article >正文

【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.kler.cn/a/158852.html

相关文章:

  • 号卡分销系统,号卡系统,物联网卡系统源码安装教程
  • 基于YOLOv8深度学习的公共卫生防护口罩佩戴检测系统(PyQt5界面+数据集+训练代码)
  • SystemVerilog学习笔记(十一):接口
  • 调用门提权
  • 录的视频怎么消除杂音?从录制到后期的杂音消除攻略
  • 24-Ingest Pipeline Painless Script
  • 有权图的最短路径算法
  • 关于“你对SpringCloud的理解”
  • TrustZone之虚拟地址空间
  • Python sorted函数及用法以及如何用json模块存储数据
  • 【精选】SpringDI依赖注入及注解实现SpringIoC
  • 对抗生成网络-G与D的loss异常问题
  • CoreDNS实战(十)-kubernetes插件
  • 怎么让CMake不使用VS作为构建工具,而是使用gcc
  • VMware安装Debian12.2作为服务器(无桌面)
  • 微信小程序生成二维码并保存到本地方法
  • 【MySQL】基本安装配置
  • 单片机开发常见问题集合
  • 【“C++ 精妙之道:解锁模板奇谭与STL精粹之门“】
  • SpringBoot JprotoBuf序列化与反序列化的实现
  • Springboot项目启动成功后可通过五种方式继续执行
  • QLineEdit 的 InputMask掩码
  • vue+echarts实现依赖关系无向网络拓扑结图节点折叠展开策略
  • 使用Redis构建简易社交网站(1)-创建用户与动态界面
  • 【渗透+取证】博客传送门(持续更新中)
  • lv11 嵌入式开发 RTC 17