C++学习 const相关

news2024/9/21 0:27:06

🤔 今天回顾C++ 时候 发现遇到关于const的变量类型(底层const 顶层const 常量指针 指针常量 常量引用…)又有点懵懵的了,然后又仔细复盘了一下 最后整理了一下 也方便记忆

文章目录

    • 引入
    • 顶层const和底层const
      • 顶层const
      • 底层const
    • 总结一下
    • 一些练习

引入

首先明确一下C/C++中的基本类型

在C/C++中,分为常量,变量,字面量三大类。

🍎常量,简单而言,就是数据类型前面加了const 的 ;

比如 const int a=2;

🍌变量,就是正常的数据类型 比如,int a=0; float a=3.2;

🍊 字面量,就是用的各种字符串,数字,比如上面我提到的 2,0,3.2等。

在这里插入图片描述

另,要再讲讲指针变量这个东西。

指针变量也就只是一个数据类型而已,和int float等一样,int类型里面存储的是整型变量,float是浮点型,而指针变量存储的是变量的地址而已,我们可以通过对指针进行一系列操作,来对这个地址上的变量的值进行更改。具体可以看看这篇blog

指针与数组


顶层const和底层const

而本文的const变量 就是 “常量”的类型,由这个常量可以引入顶层const 和底层const。

顶层const

所谓顶层const 就是一般的各种数据类型前面加上了const。对于任何数据类型都适用 算术类型 类 指针等。如:

const int a=2;
const float b=3.2;
int* const p=&a;//p是一个const变量,是一个int*类型的;也就是这是一个int类型的常量指针(从右往左读)

这种类型的const 被成为顶层const。可以这样理解,这种类型的数据的值,一旦初始化就不可更改(所以叫顶层嘛)。具体的,一旦定义了a 这个整型常量,a就不可更改了;定义了p这个指针常量(挺好记忆的,就是这个指针变量的值是一个常量,一经初始化地址不可更改),由于指针变量的值就是地址,所以p的值,也就是p指向的地址就不可更改了;

同时 int cosnt 和const int 类似的都是一个东西,所以不用太纠结。它们都是定义一个常量类型。

底层const

所谓顶层const 与指针 引用等复合类型部分相关。也就是我们常见的指向常量的指针,和 常量引用(可以类比指向常量的指针 ,简称常量指针)。

不管是常量指针还是常量引用,它们都只负责一件事:仅仅要求不能用于改变所指对象的值,而没有规定那个对象的值不能通过其他途径改变。

举个栗子🌰

比如,我用了这个指针变量,这个指针变量就不能用于改变所指对象的值,但是指针变量本身的地址是可以改变的,至于这个对象是不是const没关系,只是说不能用这个指针变量改变了。常量引用也是一样的意思。

具体一点

int i=0;
const int j=3;
const int *p =&j;
const int *p2=&i;

上面两个都是合法的,只是说,不能通过指针变量去更改j和i的值了,但是指针指向的地址可以后面再变化。

总结一下

🌿

顶层const 可以理解为很普通的常量类型,在各个变量之前加一个const

底层const 与指针 引用等复合类型部分相关。

由这两组cosnt 催生出了指针常量(顶层const) 和常量指针(底层const),前者,由于是顶层const,所以一旦初始化之后就不能够更改指针变量的值,也就是地址。而后者,仅仅要求不能用于改变所指对象的值

一些练习

这些练习选于C++ Primer

const int v2= 0;int v1 = v2;
int *pl = &v1,&r1 = v1;
const int *p2 = &v2, *const p3 = &i,&r2 = v2;
//判断下面的语句是否合法,声明如上。
rl = v2;
pl = p2; 
p2 = pl;
pl = p3;
p2 = p3;

🌈下面进行逐步的分析。

1️⃣rl是int类型的变量,v2是顶层const,简单理解为int类型的常量。

rl=v2,合法,就是一个简单的赋值操作。

2️⃣p1是int类型的指针,p2是底层const(也就是常量指针),p1=p2,可以这么理解,把p2的值(也就是p2指向的地址)赋值给p1的值(p1指向的地址)。但是我们知道p2是一个底层const,不能用于改变指向的值,也就是说既然选择用了p2这样的数据类型,那么其指向的地址的值默认不能随意被改变,从而起到一个保护的作用。而p1 是一个普通的指针变量,可以随意改变指向地址的值。所以把p2赋值给p1是不安全的行为,是不合法的。

3️⃣ 如果要把p1​赋值给p2,最多就是p1指向的地址的值不能用p2进行随意更改了,变得更安全了,所以是合法的。

4️⃣ p3 即const int *const p3=&i;是顶层const也是底层const,和上面的同理,如果pl=p3 那么pl就可以改变p3 所指的值和地址了。

5️⃣ p2 = p3; 这是合法的。p2得到了p3指向的地址,不能进行更改,而p3恰好也是一个底层const,其所指向的地址值不允许被更改,所以是合法的。

🌈ok ,完结 看到这里点个赞吧 ~~ 如有错误,欢迎批评指正。

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

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

相关文章

[Windows CMD] 查看网络配置 ipconfig

ipconfig 是一个网络命令工具,用于显示所有适配器(网络接口)的 IPv4 和 IPv6 配置信息。这个命令在 Windows 操作系统中非常常用,也存在于其他一些基于 IP 的网络系统中,如 macOS 和 Linux(在这些系统中通常…

自动曝光Flicker现象分析

1、sensor Flicker现象 相机输出画面会出现频闪,尤其是对着日光灯管场景,画面中有水波纹渐变或者阴影纹路,如下图所示。 所展示的现象为: 1、同一帧的不同行的亮度各不相同,存在亮暗变化的条纹; 2、不同…

睿抗题解集

睿抗 2023国赛RC-u1 睿抗,启动!RC-u2 桌游猜谜RC-u3 兰州拉面派餐系统RC-u4 拆积木RC-u5 栈与数组总结2023国赛 RC-u1 睿抗,启动! #include<bits/stdc++.h> using namespace std; const int N=1e6+10; char a[26],b[26]; string s;int change(int op,int idx){if(op…

Docker安装oracle19c

文章目录 Docker安装oracle19c1. 拉取镜像2. 创建目录并赋权3. 构建容器并启动4. 查看日志5. 登录docker容器里面6. 登录sqlplus 创建PDB用户7. 查看show pdbs7. 切换数据库8. 创建用户9. 授权10. 使用navicat连接11. 参考和感谢 Docker安装oracle19c 1. 拉取镜像 docker pul…

SQLite3(3):Qt中使用SQLite3

目录 一、前言 二、Qt相关类 2.1 QSqlDatabase 2.2 QSqlQuery 2.3 QSqlQueryModel 三、Qt基本应用实现 3.1 mainwindow.h 3.2 mainwindow.cpp 3.3 应用界面 四、总结 一、前言 本文进行在Qt中实现SQLite3的基本功能实现演示。 在Qt中不论我们连接的何种类型的关系型…

尝鲜免费文生视频!【智谱清影】

&#x1f680;&#x1f680;震撼发布&#xff01;你还在为制作短视频头疼吗&#xff1f;耗时太长&#xff1f;技术门槛高&#xff1f;别怕&#xff0c;AI生成视频神器——清影&#xff08;Ying&#xff09;来啦&#xff01;只需30秒&#xff0c;就能get到一段6秒的炫酷视频&…

vue2实现el-tab的内容框右击关闭除了首页的其他所有页面

效果图 <!-- 右键功能 --><div v-show"contextMenuVisible"><ul :style"{left:menuLeft px,top:menuToppx}" class"contextmenu"><li><el-button type"text" click"closeAll" size"mini&qu…

分类预测 | Matlab实现CNN-LSSVM多特征故障诊断/分类预测

分类预测 | Matlab实现CNN-LSSVM多特征故障诊断/分类预测 目录 分类预测 | Matlab实现CNN-LSSVM多特征故障诊断/分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机故障诊断/分类预测&#xff08;Matlab完…

springboot高等职业院校实验室信息管理-计算机毕业设计源码24015

摘 要 本文旨在设计并实现一个基于Spring Boot框架的高等职业院校实验室信息管理系统。该系统采用B/S体系结构&#xff0c;以MySQL作为数据库管理平台&#xff0c;结合前端技术如HTML、CSS和JQuery&#xff0c;为用户提供一个功能全面、操作便捷的实验室信息管理平台。 在系统设…

Keras入门:一维线性回归问题

目录 一、一维变量线性回归 1. 数据生成 2. 建立训练模型 3. 作图 4. 完整代码 一、一维变量线性回归 1. 数据生成 import keras import numpy as np import matplotlib.pyplot as plt #matplotlib inline xnp.linspace(0, 100, 30) #0~100之间&#xff0c;生成30个数 y…

xLua | xLua Framework | 2 加载

0. 基础 0.1 不同加载模式 测试用 编辑器模式&#xff1b;打包模式&#xff1b;更新模式 public enum GameMode {EditorMode,PackageBundle,UpdateMode, } 0.2 加载资源步骤与接口 private void LoadAsset(string assetName, Action<Object> action) {if (AppConst.G…

vue3使用递归组件渲染层级结构

先看看是不是你想要的&#xff1a; 当有层级去渲染的时候&#xff0c;嵌套的层级不明确&#xff0c;这时只能通过递归组件去渲染。 数据如下&#xff1a; 通过判断subCatalog这个字段的长度是否大于0来确定是否有下级。 上代码&#xff1a;(代码是使用uniapp开发的&#xff0…

visual studio 问题总结

一. Visual Studio: 使用简体中文&#xff08;GB2312&#xff09;编码加载文件, 有些字节已用Unicode替换字符更换 解决方法&#xff1a;vs 工具-》选项-》文本编辑器

24年第三届钉钉杯大学生大数据挑战赛浅析

需要完整资料&#xff0c;请关注WX&#xff1a;“小何数模”&#xff01; 本次钉钉杯大数据挑战赛的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&#xf…

【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator

ERROR: Failed building wheel for jupyter-nbextensions-configurator 目录 ERROR: Failed building wheel for jupyter-nbextensions-configurator 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我…

【深入理解SpringCloud微服务】深入理解nacos

【深入理解SpringCloud微服务】深入理解nacos Nacos服务注册内存注册表内存注册表的更新通知客户端服务变更、服务同步、健康检查2.x版本nacos的变化 Nacos服务注册 spring-cloud-alibaba-nacos-discovery通过实现spring-cloud-commons规范定义的接口&#xff0c;完成nacos接入…

西电网络空间安全综合953考研分享||西安电子科技大学

一、院校选择 如何选择适合自己的学校以及专业 1. 首先要对自己选择的学校有热情&#xff0c;选择自己最想去的学校 2. 其次选择在自己能力范围内努力能考上的学校&#xff0c;综合考虑地区&#xff08;不同地区公共课分数有一定的差别&#xff09;、学校&#xff08;建议跨…

MySQL索引、事务(数据库管理与高可用)

一、索引的概念 索引&#xff1a;排序的列表&#xff0c;对数据进行快速的查询&#xff1b; 针对不同的产品需求&#xff0c;或者不同的数据库结构&#xff0c;会创建不同的索引&#xff1b; 1&#xff1a;普通索引&#xff08;默认索引&#xff09; 2&#xff1a;唯一索引…

如何有效的进行小程序的优化

如今小程序已经成为了许多开发者开展业务&#xff0c;提供服务的重要平台 。所以如何有效的优化小程序成为了开发者关注的首要问题&#xff0c;以下是一份详细的小程序优化方案&#xff1a; 一、目标设定 明确小程序优化的主要目标&#xff0c;例如提高用户留存率、增加用户活…

writing classes ... [xxx of xxxx] 执行时间太长

一、问题展示 二、解决方法 打开设置【File - Settings…】修改堆大小