C++学习笔记-const
const在C++中有着大量的运用,深刻理解const有助于进一步理解C++。
const基础知识
int main()
{
    const int a;//C++中必须初始化
    int const b;//C++中必须初始化
    const int *c;
    int * const d;
    const int * const e ;
    return 0;
}
初级理解:const是定义常量 <=> const意味着只读
含义:
- 第一个第二个意思一样 代表一个常整形数
- 第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
- 第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
- 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
const好处:
- 指针做函数参数,可以有效的提高代码可读性,减少bug
- 清楚的分清参数的输入和输出特性
C语言中const的缺陷
int main()
{
	const int a = 10;
	int *p = (int*)&a;
	printf("a===>%d\n", a);
	*p = 11;
	printf("a===>%d\n", a);
	return 0;
}
通过以上程序可以改变a的值,不符合预期
C++编译器对const常量的处理
当碰见常量声明时,在符号表中放入常量
问题:那有如何解释取地址
编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)
C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值
结论:
- C语言中的const变量
- C语言中const变量是只读变量,有自己的存储空间
 
- C++中的const常量
- 可能分配存储空间,也可能不分配存储空间
- 当const常量为全局,并且需要在其它文件中使用
- 当使用&操作符取const常量的地址
 
const和#define的区别
- C++中的const常量类似于宏定义
- const int c = 5; ≈ #define c 5
 
- C++中的const常量在与宏定义不同
- const常量是由编译器处理的,提供类型检查和作用域检查
- 宏定义由预处理器处理,单纯的文本替换
 
define的范围控制
#define MAX 10
···
#undef MAX
C++学习笔记-const的更多相关文章
- ES6-11学习笔记--const
		新声明方式:const 1.不属于顶层对象 window 2.不允许重复声明 3.不存在变量提升 4.暂时性死区 5.块级作用域 以上特性跟let声明一样,特性可看 let 的学习笔记:链接跳转 ... 
- js-ES6学习笔记-const命令
		1.const声明一个只读的常量.一旦声明,常量的值就不能改变. 2.const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值. 3.const的作用域与l ... 
- C++学习笔记-const和static
		const 1.使用const来定义常量 const int num = 10; //应该在声明时进行初始化,否则该常量的值是不确定的,而且无法修改 2.const与指针 指向常量的指针(const修 ... 
- c语言学习笔记 const变量
		在c语言的编程过程中经常会遇到有常数参加运算的运算,比如这种. int a=100*b; 这个100我们叫常数或者叫常量,但是程序中我们不推荐这种直接写常数的方法,有两个缺点. 第一是程序可读性差. ... 
- C语言学习笔记--const 和 volatile关键字
		1.const关键字 (1)const 修饰的变量是只读的,它不是真正的常量,本质还是变量,只是告诉编译器不能出现在赋值号左边! (2)const 修饰的局部变量在栈上分配空间 (3)const 修饰 ... 
- ES6学习笔记<一>  let const class extends super
		学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ... 
- JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
		JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ... 
- linux驱动开发之块设备学习笔记
		我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ... 
- BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】
		2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3665 Solved: 1422[Submit][Status][Discuss] ... 
随机推荐
- oracle数据库 ORA-01461: can bind a LONG value only for insert into a LONG column解决方案
			oracle编码分为ZHS16GBK.utf8网上很多都是说驱动包 ojdbc6 和 ojdbc14 的问题实际上在遇到这个问题是需要同时加载两个jar 分别是class12.jar和nls_char ... 
- logback.xml 配置详解(转)
			<?xml version="1.0" encoding="UTF-8"> <configuration> <!-- 设置控制台日 ... 
- maven项目pom.xml中parent标签的使用(转)
			原文地址:https://blog.csdn.net/qq_41254677/article/details/81011681 使用maven是为了更好的帮项目管理包依赖,maven的核心就是pom. ... 
- Android蓝牙操作
			1.添加蓝牙权限 <uses-permission android:name = "android.permission.BLUETOOTH"/> <!--启用应 ... 
- 【JZOJ5605】【NOI2018模拟3.26】Arg
			题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 解题思路 如何求出一个序列的LIS? 对于二分的方法,每次插入一个数,将它放到第一个 ... 
- vue学习时遇到的问题(一)
			1.vue的异步组件,require()方法 作用是:在需要使用的时候,从 根目录/components/HelloWorld.vue 加载组件 import Vue from 'vue' impor ... 
- VirtualBox:无法访问共享文件夹
			造冰箱的大熊猫@cnblogs 2019/5/9 问题:VirtualBox中安装Linux虚拟机,设置宿主机某个文件夹为虚拟机的共享文件夹.在虚拟机中,该共享文件夹显示为“sf_×××”,打开该文件 ... 
- 20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)
			题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ... 
- zabbix服务端接收的数据类型,便于编写脚本向服务端提交数据
			1.数据类型1:zabbix_agent执行脚本提交字典 UserParameter=tcp_port_listen,/usr/local/zabbix/share/script/get_game_p ... 
- Codeforces Gym 101630J Travelling from Petersburg to Moscow (最短路)
			题目链接 http://codeforces.com/gym/101630/attachments 题解 zyb学长的题. 先枚举第\(k\)大的边权,设其边权为\(x\),然后把每条边边权减掉\(x ... 
