在C++中有#define 哟const 有 constepr等不同的关键字,他们之间有相似的地方,也有不同的地方。
首先是#define 关键字,这个只是在预编译之前的简单替换、
const 关键字修饰的更多的表达的是一种readonly的意思,就是只读。这个不一定是常量,但是一定是不可以读取,const变量的初始化可以在运行的时候确定,他只是限制了在运行的时候只可以读取, 实际上const变量在运行的时候也可能是变化的,例如:通过const_cast()进行去除了const限定(对于const修饰的变量,依然是是只读的详情见[参考文献1]),或者是其他的方式修改了这个内存的值。。但是对于const修饰的变量来说,他只是可读的,这个两个并不是冲突的。同时const的变量的存放位置和一般的变量是没有太大的差别的,可以是栈,可以是堆,也可是是,.data段,.bss段。const只是表面这个变量只可以读取。
同时const修饰的指针是情况可以比较复杂,原则是const指针距离谁近就是修饰谁:
1 const int *p = &a;
const 离 int 更近, 所以p这个指针本身可以改变,但是p所指向的内容,也就是 *p不可改变
2 int* const p = &a;
const 离 p更近近,也就是说p这个指针不可以改变,但是指向的内容是可以改变的的
3const int* const p = &a;
两个都修饰的了,都不可以改变
4 int const *p = &a;