一、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常量取地址时,分配空间
其他情况不分配空间