【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

const是C/C++语言中的关键字,但是如果用的好,可以极大地提高代码的健壮性。一般来说const使用的地方还是蛮多的,但是主要还是下面几个地方:(1)普通变量的保护;(2)地址空间的保护;(3)类初始变量的声明和保护;(4)类变量在函数中的保护。const的保护主要来自于编译器层面,和程序的运行没有关系。

(1)普通变量的保护

const int data = 10;
const char str = 'a';
const double pi = 3.14;

上面的代码就是一组全局变量的定义,如果在函数中变量发生了修改,那么代码就会编译失败。

(2)地址空间的保护

void process()
{int value = 10;const int* address = &value;
}

和上面代码不一样的地方就是,这里如果address地址指向的数值发生了改变,那么那么代码就会编译失败?大家可以在函数结束前添加*address = 100;试试看?

(3)类const成员变量的定义

class desk
{const int price;
public:desk():price(10){}~desk() {}
};

const成员变量 就是在类变量定义的时候前面添加const关键字。和普通的成员变量不一样,const变量在构造函数中一定要初始化操作的。如果没有const关键字,那么在构造函数内部就无所谓是不是需要初始化了。

(4)类const函数

class desk
{int price;
public:desk() {}~desk() {}void print() {return;}void print() const {return;}
};

那么desk里面的print和print() const函数是不是一样的呢?大家可以看一下这个代码:

53:       desk m;
0040122D   lea         ecx,[ebp-10h]
00401230   call        @ILT+75(desk::desk) (00401050)
00401235   mov         dword ptr [ebp-4],0
54:       m.print();
0040123C   lea         ecx,[ebp-10h]
0040123F   call        @ILT+70(desk::print) (0040104b)
55:       const desk n;
00401244   lea         ecx,[ebp-14h]
00401247   call        @ILT+75(desk::desk) (00401050)
0040124C   mov         byte ptr [ebp-4],1
56:       n.print();
00401250   lea         ecx,[ebp-14h]
00401253   call        @ILT+65(desk::print) (00401046)
57:   }

上面是一段函数调用的代码。我们在53行和55行定义了desk类型的变量m和n。接着在54行和56行,我们分别利用两个变量调用print函数进行处理,我们发现两个调用的函数地址并不一样,其中一个是0x0040104b,另外一个是0x00401046,我们可以继续跟进去看一下:

00401046   jmp         desk::print (00401310)
0040104B   jmp         desk::print (004012e0)

这里虽然是两个跳转函数,但是事实已经证明这里的两个函数确实是不一样的,这也证明了我们的判断是正确的。

【预告: 下一篇博客是关于模板类的内容】

用汇编的眼光看C++(之const属性)相关推荐

  1. 用汇编的眼光看C++(之 总结篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 早在八月份的时候,就陆陆续续写了二十多篇用汇编语言看C++的博客内容.在此为了做一个概括,也为 ...

  2. 用汇编的眼光看C++(之退出流程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 无论是在判断还是在循环的过程中,通常在遇到合适的条件的时候就会退出相应的模块.跳出模块运行的方 ...

  3. 用汇编的眼光看C++ (之x86汇编)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 说到用汇编的眼光看C++语言,那么怎么阅读汇编代码就成了我们需要解决的一个问题.其实,实话说, ...

  4. 用汇编的眼光看C++(之算术符重载)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算术符重载是类的有一个特性,但是每个人使用的方法不一样.用的好,则事半功倍:但是如果不正确的使 ...

  5. 用汇编的眼光看C++(之判断流程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在我们平常的编程当中,用于判断的地方很多,但主要有下面三种方式:if-else:switch: ...

  6. 用汇编的眼光看C++(之拷贝、赋值函数)

    拷贝构造函数和复制函数是类里面比较重要的两个函数.两者有什么区别呢?其实也很简单,我们可以举个例子,加入有这样一个类的定义: [cpp] view plaincopy class apple { pu ...

  7. 用汇编的眼光看C++(之算术符重载陷阱)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在算术符重载里面,"="重载可能是最经常使用的一种.但是好多人就误以为在函 ...

  8. 从汇编的眼光看C++(之指针拷贝)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此.特别是在C++中,如果 ...

  9. 用汇编的眼光看C++(之虚函数)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 虚函数是面向对象设计中的一个重要内容.它的出现使得我们只需要相同的接口函数,并可以得到不同的生 ...

最新文章

  1. java concurrenthashmap与阻塞队列
  2. android 模拟器Genymotion的安装和使用
  3. PHP笔记 ---关于web应用的安全性问题
  4. 为什么银行没有厕所?内急了怎么办!
  5. cmd中输入net start mysql 提示:服务名无效
  6. Python《通过解析http请求搞定动态加载,爬取toutiao图片》
  7. spring cloud zuul 原理简介和使用
  8. Android OpenGLES2.0(十四)——Obj格式3D模型加载
  9. C++STL笔记(十一):priority queue(带优先级的队列)详解
  10. iPhone4S安装Linux系统,别失望太早 iPhone 4S其实就是iPhone 5
  11. R语言-层次分析法--AHP
  12. 科大学长对数学系学弟学妹的忠告
  13. java-房屋出租系统
  14. oppo(不root)手机查看万能钥匙破解的wifi密码实例
  15. 眼睛又干又痒,到底是干眼症还是结膜炎?
  16. ATT CK 阶段之 Initial Access --Drive-by Compromise
  17. 【已解决】Android Studio下,gradle project sync failed 错误
  18. html5手机端纵向时间轴,html5触屏手机端响应式时间轴内容切换特效
  19. 请用python3编写一个计算器的控制台程序_二、软件工程慕课第一章作业题——编写一个计算器...
  20. windows 驱动开发基础(二)事件通知---关于irp处理,DPC,链表等

热门文章

  1. 又一次寻找bug的经历...这次是 openlayers + chrome + win7
  2. 3月国内网站流量:腾讯夺第二 360安全中心降至第三
  3. Oracle数据库的启动与关闭
  4. vc6.0 radio控件多个分组
  5. kafka + storm 错误 Async loop died
  6. LPC1768之GPIO
  7. 关于安装完Node.js 出现node is not dedined 问题
  8. 各浏览器中的鼠标滚轮事件处理
  9. layoutSubview调用条件
  10. Windows Mobile 中怎样获得当前应用程序所在路径