C++ const的自我理解
C++学习笔记–const
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。
常变量
const 类型名 变量名 = 初始化值;
必须要初始化
并且const定义的变量的值不能变,如图所示,编译器会报错不能运行

如果用一个指针变量(int *p)指向(const int a)
会报错

我们用强制转换试一下
发现 *p 指向的内存的值被修改
但是a的值不变

设一个断点调试一下
初始a = 20, *p = 20

*p = 10之后, a = 10, *p = 10
但是输出 a 是20
因为const,编译器认为a就是20

让 b = *p; 结果b = 10

再让b = a; 结果b = 20

编译器认为a = 20; 但是调试的时候显示 a = 10, 因为之前用 *p 修改了
常指针
常指针有三种
1. const 类型名 * 变量名 = 初始化值;
或者 类型名 const * 变量名 = 初始化值;
指向的变量的值不能修改,可以修改指向的变量
2. 类型名 * const 变量名 = 初始化值;
指向的变量不能修改,但是可以修改指向的变量的值,类似于引用
3. const 类型名 * const 变量名 = 初始化值;
指向的变量还有指向的变量的值都不能修改
const 类型名 * 变量名 = 初始化值;
或者 类型名 const * 变量名 = 初始化值;
指向的变量的值不能修改,可以修改指向的变量
如果修改指向的变量的值会提示错误

但是可以修改指向的变量

const 在 * 号左边,左定值
类型名 * const 变量名 = 初始化值;
指向的变量不能修改,但是可以修改指向的变量的值,类似于引用
如果修改指向的变量会报错

可以修改指向的变量的值

const 在 * 号右边,右定向
const 类型名 * const 变量名 = 初始化值;
指向的变量还有指向的变量的值都不能修改
两种的结合
指向的变量的值不能修改

指向的变量不能修改

综上所述:
const 在 * 号左边定值(指向的变量的值不能修改)
const 在 * 号右边定向(指向的变量不能修改)
常引用
const 类型名 &变量名 = 初始化值;
定义的常引用变量不能修改原变量的值

普通引用变量可以修改原变量的值

常数组
const 类型名 数组名[N][M]… = 初始化值;
数组元素的值不能修改
通过指针也不能修改
必须初始化

C++ 与 C 中 const的区别
C++ 中: const 正常情况下是看成编译期的常量,编译器并不为 const 分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中。
C 中: const是一个不能被改变的普通变量,编译器不知道编译时的值。
例如 C++ 中可以:
const int N = 10;
int a[N] = {1, 2, 3};

C语言中则报错


const 与 #define
区别: C++中定义常量的时候不建议采用define,因为define只
做简单的宏替换,并不提供类型检查;
const不能代替#define,#define中还有许多其他功能是const所不能完成的。
C++ const的自我理解的更多相关文章
- Thread线程join方法自我理解
Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...
- const的全面理解
const关键字用来作甚?const是一个类型修饰符.常见的类型修饰符有哪些? short long unsigned signed static autoextern register 定义一个变量 ...
- 对 const char* const &a 的理解
定义中用到&是独立引用. 比如: char i; char &a=i; 表示a是i的一个单独引用. 当有i='a'时,也有a='a'; 当有a='c'时,也有i='c'; 两个变量的标 ...
- AC自动机自我理解和模板
给出长度为m的文本 查询 n个单词出现的次数 用kmp 复杂度 n*m*(单词平均长度) 用字典树 复杂度 m*每次字典树遍历的平均深度) AC自动机 复杂度 m (思路可以理解为kmp+字典树 ) ...
- const char * 组合理解
1 . const char *ptr 从char *ptr 可以理解为指向字符常量的指针,ptr是一个指向char *的常量,*ptr的值为const,不能修改. 2. char const *pt ...
- 关于C#的委托(delegate)的自我理解
首先描述一个事情,一个老师饿了,他要去买东西填饱肚子,然后他发现他的学生“小李”在玩,没学习,于是就委托“小李”去帮他买吃的. 根据这件事我们来分析: 首先得有个老师(老师饿了是他的方法,老师买东西也 ...
- fread与fwrite的自我理解
size_t fread(void* buff,size_t size,size_t count,FILE* stream) 参数1:读取到该buff所指向的内存空间中 参数2:每次读取的字节数,单 ...
- android 的生命周期自我理解
android的active的生命周期,经过网站的blog学习,加上自己的理解总结如下: 第1种:全新的启动应用程序顺序 onCreate--->onStart---->onResume ...
- Java内部类的自我理解
本文借鉴网络上多位大牛的博客和文章.感谢各位不知名人士的分享. 一.什么事内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的成员,而且依附于外部类而存在的.内部类能够为静态,可用p ...
随机推荐
- Mac安装stf
1.brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config 2.node版本8.x我的是8.15.0 3.npm i ...
- uvalive6468,51cthink1419 Strange Antennas (离散化)
题意: 在一个 n x n 的平面上,给定 m 个等腰直角三角形(各点均为整数),问该平面上被三角形覆盖奇数次的点有多少个. 思路: 由于 n 较大,不能模拟解决,故使用离散化思想. 考虑每一行有多少 ...
- CAS 算法与 Java 原子类
乐观锁 一般而言,在并发情况下我们必须通过一定的手段来保证数据的准确性,如果没有做好并发控制,就可能导致脏读.幻读和不可重复度等一系列问题.乐观锁是人们为了应付并发问题而提出的一种思想,具体的实现则有 ...
- 关于设置Vscode缩进,保存代码任然缩进无效解决方式
在Vscode按F1,运行命令,输入Formatter config 把内容更改为以下代码 { "onSave": true, "javascript": { ...
- python坐标获取经纬度或经纬度获取坐标免费模块--geopy
一.官方文档 https://github.com/geopy/geopy 二.模块安装 pip3 install geopy 三.简单实用 from geopy.geocoders import N ...
- Spring Boot 学习摘要--关于配置
date: 2019-12-27 09:00:00 updated: 2019-12-30 13:20:00 Spring Boot 学习摘要--关于配置 学习教程来自:B站 尚硅谷 1. 关于配置 ...
- 使用TypeScript给Vue 3.0写一个指令实现组件拖拽
最近在用vue3重构后台的一个功能.一个弹窗组件,弹出一个表单.然后点击提交. 早上运维突然跑过来问我,为啥弹窗挡住了下边的表格的数据,我添加的时候,都没法对照表格来看了.你必须给我解决一下. 我参考 ...
- short i =1; i=i+1与short i=1; i+=1的区别
很典型的一到JAVA 基础面试题,上次面试遇到的,现在记录一下. short i =1; i=i+1;short i=1;i+=1;这两有什么区别呢 ?对两个容量不一样的数据类型的变量进行算术运算时, ...
- 【2】TensorFlow光速入门-数据预处理(得到数据集)
本文地址:https://www.cnblogs.com/tujia/p/13862351.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...
- K8S 使用 SideCar 模式部署 Filebeat 收集容器日志
对于 K8S 内的容器日志收集,业内一般有两种常用的方式: 使用 DaemonSet 在每台 Node 上部署一个日志收集容器,用于收集当前 Node 上所有容器挂载到宿主机目录下的日志 使用 Sid ...