C++ const基础和const符号表机制探究
来源:互联网 发布:深圳网络指尖公司 编辑:程序博客网 时间:2024/06/06 02:00
一、const基础
const修饰的是常量,定义的时候必须初始化,这里只做举例说明
const int a;
int const b;
//以上这两种写法是一样的
const int *c; //const修饰的是指针所指向的内存空间,不能被修改
int *const d; //const修饰的是指针变量,即指针变量本身不能被修改
const int *const e; //指针变量以及其所指向的空间都不能被修改
下面做举例说明:
#include <iostream>typedef struct Teacher{ char name[64]; int age;}Teacher;//指针所指向的内存空间,不能被修改int operatorTeacher01(const Teacher *pT){ //pT->age = 10;//编译错误 return 0;}//指针变量本身不能被修改int operatorTeacher02(Teacher * const pT){ pT->age = 10; //所指向的内存空间可以被修改 //pT = NULL; //编译错误 pT本身不能被修改 return 0;}//指针变量所指向的内存空间和指针变量本身都不可以被修改int operatorTeacher03(const Teacher * const pT){ //pT->age = 10;//编译错误 //pT = NULL;//编译错误 std::cout << "age:" << pT->age; return 0;}int main(){ //尝试调用operatorTeacher03方法 Teacher t1; t1.age = 33; operatorTeacher03(&t1); return 0;}
用const的好处:
1、指针做函数参数,可以有效的提高代码的可读性,减少bug
2、清楚的分清楚参数的输入和输出特性
以上是const基础
二、const符号表机制探究
1、C语言中的const是一个冒牌货,C++中 const才是一个真正的常量
2、原因分析
C语言中,定义的const将重新分配一个内存空间
C++中,编译器对const做了特殊处理,将const常量放到符号表中
下例中,p = (int *)&a;对a变量取地址,C++编译器会为a再单独的开辟一块儿内存空间,p就是指向了这块儿内存空间,无论怎么改,也改变不了符号表中对应的值
而当调用a的时候,还是会在符号表中取值,所以做到了真正的不变
而C语言中只是给常量申请了块儿内存空间
所以,C++中可以说是将const变成了真正的const
下面做举例说明
#include <stdio.h>int main(){ //看起来好像a是一个常量,其实不然 const int a = 10; //a = 11; int *p = NULL; p = (int *)&a; *p = 20; //间接赋值 printf("a:%d\n",a);//在C语言中,a变成了20,而在C++中,a依然是10 return 0;}
结论:
1、C语言中的const变量
2、C语言中的const变量是只读变量,有自己的存储空间
3、C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用时,分配空间
当使用&操作符取const常量取地址时,分配空间
其他情况不分配空间
- C++ const基础和const符号表机制探究
- const符号表机制
- const探究
- C基础之CONST
- [C++] typedef和const
- C++:const和引用
- C++:const和指针
- C++:const和sizeof
- C++const函数和const对象
- 【C++】const对象和const成员
- C++Primer----顶层const和底层const
- c语言基础之const
- C语言基础-const用法
- C基础 const volatile等
- CONST机制
- extern const 探究
- const变量探究
- C++基础:static 和const
- ES6(四: 字符串新增API)
- 区块链技术是什么?
- WebGL三角形平移变换(矩阵方式)
- Travel in deep space(Solar)
- 时间复杂度和空间复杂度详解
- C++ const基础和const符号表机制探究
- 1056组合数的和(数学问题)
- 记录下此时的心得体会
- word分隔符
- Java学习笔记之反射机制
- 1049数列的片段和(数学问题)
- 关于springMVC 接收date 类型为空时候的异常解决办法
- django基础入门(6)-模板
- Core Java Volume I 读书笔记---第十三章 集合