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 ...
随机推荐
- Codeforces Round #676 (Div. 2) A - D个人题解(E题待补)
1421A. XORwice 题目链接:Click Here // Author : RioTian // Time : 20/10/18 #include <bits/stdc++.h> ...
- JAVA 基于Jusup爬虫
java爬虫核心:httpclient slf4j jsoup slf4j 配置文件log4j.properties log4j.rootlogger=DEBUG,A1log4j.logger.cn. ...
- JUC之线程池-三大方法-七大参数-四种拒绝策略
线程池:重点 三大方法 七大参数 四种拒绝策略 使用池化技术的理由: 我们的程序伴随着创建销毁线程十分浪费资源, 所以使用线程池,先创建线程,随用随取,用完归还 简单来说就是节约了资源. 使用线程池的 ...
- pyside2安装避坑
cmd 输入 pip install PySide2 官方下载太慢 清华源: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pysid ...
- 创建Sqlite数据库(一)
对这方面的掌握不牢,慢慢深入吧,先执行一个sqlite语句,只会简单的.输出"创建"证明创建成功 public class MainActivity extends AppComp ...
- Sword Art Online 刀剑神域
date: 2014-10-06 15:30:11 updated: 2014-10-06 15:30:11 [一] 他和她,第一次相见是在游戏里,两个角色的对话.现在说来都不算是正式见面呢. &qu ...
- sql布尔盲注和时间盲注的二分脚本
布尔盲注: import requests url = "http://challenge-f0b629835417963e.sandbox.ctfhub.com:10080/" ...
- Zabbix批量添加Hosts
添加脚本 addhost.py #coding:utf-8 import json import urllib2 from urllib2 import URLError import sys imp ...
- Luogu P2447 [SDOI2010]外星千足虫
题意 给定 \(n\) 个变量和 \(m\) 个异或方程,求最少需要多少个才能确定每个变量的解. \(\texttt{Data Range:}1\leq n\leq 10^3,1\leq m\leq ...
- Java学习的第三十七天
1.例3.1求一元二次方程的根 import java.util.Scanner; public class cjava { public static void main(String[]args) ...