2变量与基本类型之const限定符
一、const介绍:
const对象一旦被创建其值就不能再改变,所以const对象必须初始化。任何试图对const赋值的行为都会引发错误。
二、初始化和const:
对const对象的主要限制就是只能在const类型的对象上执行不改变其内容的操作。
int i = ;
const int ci = i; //正确,i的值被拷贝给ci
int j = ci; //正确被拷贝给j
以上操作都是被允许的,ci的常量特性仅仅在执行改变ci的操作时才会发挥作用。记住拷贝一个对象的值并不会改变它。
三、默认情况下,const对象只在文件内有效:
当我们定义了如下代码时:
const int i = ;
编译器将在编译过程中把文件内的变量i全部替换成23,所以默认情况下const对象只对文件内的i有效。当其它文件中也有const i的定义时,认为是两个相互独立的变量。
如果想在多个文件之间共享const对象,则必须在变量的定义之前添加extern关键字。
四、const的引用:
绑定到const对象的引用称为对常量的引用(reference to const)
引用(reference)的类型必须与所引用对象(object)的类型一致。但是有以下两个例外:
- 允许用任意表达式作为初始值,只要该表达式能够转换成引用的类型即可。
五、顶层和底层const:
顶层const是说指针本身是个常量,底层const是表示指针指向的对象是个常量。
顶层const可以表示任意对象的对象是常量,比如算术类型、类、指针等。当执行对象的拷贝时,顶层const不受影响。你想想顶层const的意义是什么?它就是一块内存,这块内存里存的东西不能再改变,但是可以把这块内存复制给另一块内存。至于常量指针,是在栈上开辟的这块内存(4bytes)不能再指向其他的地址,但是这块地址可以拷贝啊。
const int ci = ;
const int *p2 = &ci;
const int * const p3 = p2; p2 = p3;
例如上述代码:
- 在全局存储区上开辟了一块内存存放const int变量ci.
- p2是在全局存储区开辟的一块内存,它是指向const int的指针,指向的地址是ci。它可以指向其他的地址。
- p3是在全局存储区开辟的一块内存,它是指向const int的常量指针,指向的地址是ci,它不可以指向其他的地址。
- 现在我们让p2 = p3,就是把p3的指针值(指向的地址值)拷贝给p2,虽然p3是一个常量指针,但是拷贝对于顶层const对象完全可以啊,这个const限定只是说你不能再指向其他的地址,并不意味着你不能被拷贝给其他的内存。
再看一下在底层const执行拷贝操作:
int *p = p3;
p2 = p3;
p2 = &i;
int &r = ci;
const int &r2 = i;
6 int i = 0;
例如上述代码;
- p3是一个指向p3的指针,p3又是指向const int object的指针。
- 第三行:让p2指向i的地址是正确的,因为p2是个指向常量对象的非常量指针,所以它可以改变指向的地址,由于i是个非常量对象,但是i可以转变成const int*
- 第四行:由于ci是个常量对象,但是r却是个非常量指针,你一个指向非常量的指针去指向一个常量对象的地址,显然是不行的,因为你此时能够通过该指针去改变常量兑现的的值,但是常量对象的值显然是不能被改变的。
- 第5行:你r2是一个对常量的引用,但i是个非常量对象,很明显你i可以转化成常量对象。所以你r2可以指向i.
永远记住:指向非常量类型的指针可以转成指向常量的指针,
六、const的存储:
- 对于const全局常量,如果初始值是字面值常量,一般会存放在常量存储区。
- 非static 的 const局部变量,如果需要内存空间也是在栈中进行分配
- 对于static 的 const局部变量(如函数中),会根据编译器的优化能力,以及初始值,来决定其是不进行存储,还是直接存储在常量符号表,或者是栈中等等均有可能。
- 对于const的全局变量,放在全局存储区。
2变量与基本类型之const限定符的更多相关文章
- 变量和基本类型——复合类型,const限定符,处理类型
一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...
- C++const限定符
在C语言中我们使用#define宏定义的方式来处理符号常量.而在C++中有一种更好的处理符号常量的方法,那就是使用const关键字来修改变量声明和初始化.这种处理常量方式的好处不言而喻:如果程序在多处 ...
- C++杂谈(一)const限定符与const指针
const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...
- C++ Primer 第二章 引用 指针 const限定符
1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...
- C++ const 限定符
C++ const 限定符 作用:把一个对象转换成一个常量 用法:const type name = value; 性质:1. 定义时必须初始化,定义后不能被修改.2. 类中的const成员变量必须通 ...
- const限定符的作用
const限定符的作用: 1.定义const常量:const可以将一个对象变成一个常量,不可被修改,所以定义的 时候必须进行初始 ...
- C++之const限定符
作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...
- C++之const限定符(顶层const,底层const)
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...
- const限定符用法汇总
const限定符限定变量的类型是一个常量,对象一旦创建后其值就无法改变,所以const对象必须初始化. 初始化 const int i = get_size(); //运行时初始化 const int ...
随机推荐
- Java中File类创建文件
只需要调用该类的一个方法createNewFile(),但是在实际操作中需要注意一些事项,如判断文件是否存在,以及如何向新建文件中写入数据等. import java.io.*; public cla ...
- ReactOS 代码更新后的编译安装
其实四月份就已经更新过了,最新版应该是0.4.11+,具体去GITHUB上去看. 至于编译,其实在最早的0.2版本时代,ReactOS就曾经给出过一套完整的编译方式, 并且给出过一个完整的编译环境,版 ...
- 查看github热门项目
访问 Trending 或者可以通过菜单 Explore -> 选择 "Trending" -- 默认是查看今天在github社区活跃的仓库 在 github 搜索框输入 s ...
- python 文件复制压缩
import os import time #这里是需要文件所在的位置 source=['"C:\\My Documents"',"C:\\Code"] #转换 ...
- ToDoList 增删改查
ToDoList 主要功能 增加数据 删除数据 修改数据 查寻数据渲染页面 1 . HTML页面 <!DOCTYPE html> <html lang="en"& ...
- 【TCP/IP】TCP的三次握手和四次挥手
传输控制协议(TCP)是一种面向连接的协议,网络程序使用这个协议的时候,网络可以保证客户端和服务端的连接是可靠的,安全的. 如果 A机向 B机发送“hello”,在物理网线上传输的数据不仅仅是“hel ...
- Robot Framework:环境安装
Windows Python2.7 前置条件:安装python2.7,下载地址:https://www.p ...
- PHP ftp_nlist() 函数
「大理石平台维修」大理石平台维修完后需要怎么处理? 定义和用法 ftp_nlist() 函数返回 FTP 服务器上指定目录的文件列表. 如果成功,则返回指定目录下的文件名组成的数组.如果失败,则返回 ...
- Android中的ListView的绘制过程中执行的方法
首先,系统在绘制ListView之前, 将会先调用getCount方法来获取Item的个数.(如果getCount方法返回0的话,列表时不显示任何内容的) 之后每绘制一个 Item就会调用一次getV ...
- 笨办法学Python记录--习题37 异常,lambda,yield,转义序列
习题中提到了raise,查了下,顺便所有异常类关键字罗列如下文章中: 为什么使用异常 错误处理.事件通知.特殊情况处理.退出时的行为.不正常的程序流程. 简单的示例 在没有任何定义x变量的时候: pr ...