const修饰的数据类型是常量类型,常量类型的对象和变量在定义初始化后是不能被更新的。其实只用记住这一个概念,就可以明白const操作对象的方法。

1)定义const常量

最简单的:

const int a = 1;

a = 2; (错误:a为const常量,在初始化后不能再进行改变)

而且由于这个性质,如果在定义const int a时未进行初始化,会产生编译错误。因为在程序过程中不能对const常量进行修改。而由于const限定符的只读属性,可以避免对程序数据的误操作。

2)const与define

结论:const常量能节省空间,从而避免不必要的内存分配。

阐述原因:

#define A 5

const int B = 5;

int a = A;(在编译期间进行宏替换,为A分配内存)

int b = B;(为B分配内存,初次分配后不会再分配内存)

int aa = A;(A再次分配内存)

int bb = B;(B没有内存分配)

这里define给出的是一个立即数,所以define定义的常量在内存中有若干拷贝。但const常量在程序运行过程中只有一份拷贝。

编译器通常不会为普通const常量分配存储空间,而是将他们保存在符号表中,这就是使得它成为编译期间的常量,没有了存储和读内存的操作,使得效率提高。

3)指向const对象的指针

这里可以这样理解:const后面跟上int,表示const修饰的是int数据类型,即指针指向的内容是被const限定的,不能被修改。

比如:

int a = 1;

int b = 2;

const int *ptr = &a;

这里ptr是一个指向int型的const对象指针,const限定的是ptr指向的对象(int型数据),而不是ptr本身。

所以:

*ptr = 10(错误,不能直接更新ptr指向的内容)

ptr = &b(正确,因为ptr本身并不受const的限定,ptr作为指针可以指向其他内存单元)

补充一点:

普通的指针变量是能够作为左值被赋值修改的。

比如:

int *p = &a;(*p在程序运行过程中能被修改,从而影响到a中数据的改变)

所以:

一个普通指针变量作为左值时,其右值不能是一个const常量。

比如:

const int c = 3;

int *p = &c(错误。这个其实也很好理解,*p可以随意改,那c的值也会被随意改,不满足const的性质)

实际程序中,指向const的指针常常用作函数的形参。将形参定义为指向const的指针,以此来确保传递给函数的实际对象在函数中不会因为形参而被修改。

4)const指针

这个可以和3)对应理解:const后面跟上的指针变量,指针表示地址,则const指针限定了指针本身不能被更新,但指针指向的对象可以被更新(上述3)是限定数据不能更新,指针本身可以更新,正好相反)

比如:

int a = 1;

int b = 2;

int *const ptr = &a;(首先定义const指针指向a)

如果在程序运行过程中进行如下操作:

ptr = &b(错误:因为ptr是一个const指针常量,其在运行过程中不能被更新,即不能再指向其他的内存单元)

*ptr = 3;(正确:因为*ptr是指针指向的对象,其不受const的限定,能够被更新。更新后,a的值为3)

5)指向const对象的const指针

这个就是上述3)和4)的结合。const既限定了指针,又限定了指针指向的对象。

比如:

const int a = 1;

const int *const ptr = &a;

ptr一经初始化完毕后,就不能再指向其他内存单元,也不能被修改其指向内存单元(a的地址)的数据。但a自身可以被定义为普通int型,a可以进行更新。

6)关于typedef和const指针的一个误区

typedef能够用作类型替换,类似于#define。

一个误区是:

typedef string *pstring;

const pstring ptr;

上述ptr是一个什么类型。很容易想到的是:替换pstring,变为const string *ptr。则ptr是一个指向string类型的const对象,即const修饰string数据类型。

实际不然:

看const pstring ptr。在这个里面const修饰的是pstring,而pstring是一个string类型的指针。所以在程序运行过程中,const依然应该修饰一个指针,而不是一个string对象。正确的扩展应为:

strng const *ptr;

出现这个问题的原因在于:对于const常量的表示,string const s1和 const string s2,s1和s2都是等价的类型,即const限定符即可以放在类型前也可以放在类型后。

简谈const限定符的更多相关文章

  1. 浅谈const限定符

    什么是const限定符? Const限定符是我们通常所说的常量限定符,被const修饰的对象具有常量性质,只能读,不能写. 为什么使用const限定符? 用const变量取代“魔数”,代码更容易理解和 ...

  2. C++const限定符

    在C语言中我们使用#define宏定义的方式来处理符号常量.而在C++中有一种更好的处理符号常量的方法,那就是使用const关键字来修改变量声明和初始化.这种处理常量方式的好处不言而喻:如果程序在多处 ...

  3. const 限定符

    1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...

  4. C++杂谈(一)const限定符与const指针

    const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...

  5. C++ Primer 第二章 引用 指针 const限定符

    1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...

  6. 指针和Const限定符

    指针和Const限定符 1.指向const对象的指针 如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针具有const特性. const d ...

  7. C++ const 限定符

    C++ const 限定符 作用:把一个对象转换成一个常量 用法:const type name = value; 性质:1. 定义时必须初始化,定义后不能被修改.2. 类中的const成员变量必须通 ...

  8. const限定符的作用

    const限定符的作用:                                     1.定义const常量:const可以将一个对象变成一个常量,不可被修改,所以定义的 时候必须进行初始 ...

  9. C++之const限定符

    作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...

随机推荐

  1. Runtime之字典转模型实战

    Runtime之字典转模型实战 先来看看怎么使用Runtime给模型类赋值 iOS开发中的Runtime可谓是功能强大,同时Runtime使用起来也是非常灵活的,今天博客的内容主要就是使用到一丁点的R ...

  2. BZOJ 1406 密码箱(数论)

    很简洁的题目.求出x^2%n=1的所有x<=n的值. n<=2e9. 直接枚举x一定是超时的. 看看能不能化成有性质的式子. 有 (x+1)(x-1)%n==0,设n=a*b,那么一定有x ...

  3. OI入门

    学习顺序: 1.高精度计算: 高精度计算(一) 高精度计算练习1 高精度计算(二) 高精度计算练习2 2.递推 3.递归 递归算法 递归练习 4.搜索与回溯 搜索与回溯算法(一) 搜索与回溯练习(一) ...

  4. Python虚拟环境virtualenv的使用

    virtualenv 是一个创建孤立的Python环境的工具.可以让你创建各自独立的.互不影响的Python开发环境. 使用pip安装即可 pip install virtualenv 查看是否安装成 ...

  5. BZOJ2242:[SDOI2011]计算器——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2242 https://www.luogu.org/problemnew/show/P2485 你被 ...

  6. C++中的显示类型转换

    本文参考了<C++ Primer(中文 第5版)>.<王道程序员求职宝典>以及网上相关博客,结合自己的理解写成.个人水平有限,若有错误欢迎指出. C++中显示转换也成为强制类型 ...

  7. HDU.2647 Reward(拓扑排序 TopSort)

    HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...

  8. 2 Advanced Read/Write Splitting with PHP’s MySQLnd

    原文地址需FQ才能看  https://blog.engineyard.com/2014/advanced-read-write-splitting-with-phps-mysqlnd In part ...

  9. jQuery考试

    No1: 分析:首先A答案是正确的jQuery中删除元素的方法有a,c,d所以排除B,另外c是清空,d虽然能删除但是不能删除元素所绑定的事件等等. No2: 分析:A是正确的通过get(index)的 ...

  10. 深入JavaScript对象创建的细节

    最近深入学习javascript后,有个体会:面向对象的方式编程才是高效灵活的编程,也是现在唯一可以让代码更加健壮的编程方式.如果我们抛开那些玄乎的抽象出类等等思想,我自己对面向对象的从写程序的角度理 ...