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 ...
随机推荐
- spring boot:swagger3文档展示分页和分栏的列表数据(swagger 3.0.0 / spring boot 2.3.3)
一,什么情况下需要展示分页和分栏的数据的文档? 分页时,页面上展示的是同一类型的列表的数据,如图: 分栏时,每行都是一个列表,而且展示的数据类型也可能不同 这也是两种常用的数据返回形式 说明:刘宏缔的 ...
- selenium基础 --获取内容
from time import sleep from selenium import webdriver browser = webdriver.Chrome() url = "http: ...
- 测试之-Jmeter使用
一. 修改语言 修改 在 bin 目录下的 Jemeter.properties 二 . Jmeter主要元件 1.测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器 ...
- 智能DNS的实现
网络路径远,导致用户访问延迟 各个运营商之间的带宽有阀口. GSLB 就近的返回服务器的地址 CDN网络 内容分发网络 Content Delivery Network CND服务商 阿里 腾讯 蓝汛 ...
- 51nod 最大M子段和系列(1052、1053、1115)
51nod1052 数据量小,可使用O(N*M)的DPAC,递推公式: dp[i][j]=max(dp[i-1][j-1], dp[i][j-1])+a[j]; dp[i][j]表示前j个数取 i 段 ...
- Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
写在前面 最近小伙伴加群时,我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道 ...
- abstract关键字的说法
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必 ...
- JDBC Statement PrepareStatement
1.JDBC中Statement接口和PrepareStatement接口关系与区别 Statement接口不能使用占位符?,需要拼sql,所以没有setInt,setString等方法:Prepar ...
- 晚间测试13 A. Dove 打扑克 vector +模拟
题目描述 分析 这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\sqrt{n}\) 种 知道了这个性质我们就可以用 \(vector\) 维护一个有序的序列 \(vector\) 中存放 ...
- SpringMVC中ModelAndView的两个jar包引起的思考servlet和portlet
在使用ModelAndView时,需要去导包,但是有两个包. 检查前台form表单提交的也正确,后台这也没有问题. 后来发现竟然时导包导错误了. 到此,如果是因为到错包问题,应该就解决了. 但是,深入 ...