单纯的const……..
const:限定一个变量不允许被改变。
因为常量在定以后就不能被修改,所以定义时必须初始化——《C++ Primer》。(不过对于类定义体中的视情况而定)
然而,const后面的变量依然是变量,不是常量,在内存中还是有开辟存储空间的,从本质上讲,是可以被重新赋值的,只是编译器在编译的时候会检测,不让你重新赋值。但是如果你的变量名更改之后(如强制类型转换),编译器是无法自动识别的,此时就可以改变变量的值了。
1 常变量&常数组
Eg1:
const int n= 5;int a[n];
在C语言中,const修饰成制度变量,C++中修饰成常量。
因此,在ANSI C的编译器中会报错,因为ANSIC语言中,数组的维度是个常量,const定义的是只读变量,但终究是个变量,enum类型和#define宏可以定义常量。但是在标准C++中,这种写法是对的。(数组的维度必须用大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型const对象——《C++ Primer》)。
Eg2:
#include<stdio.h>
int main()
{
const int a = 10;
*(int *)&a = 20; //强制类型转换后,是可以通过编译的
printf(“%d, %x\n”, a, &a);
printf(“%d, %x\n”, *(int *)&a, (int *)&a);
return 0;
}
利用C语言编译器编译,运行结果:(注意.c与.cpp文件后缀在编译时的区别)
20,31F73C
20,31F73C
利用C++编译器编译,运行结果:
10,31F73C
20,31F73C
这里*(int *)&a = 20;确实将20放入了改地址中,但是C++编译器在编译代码时有一个代码优化的阶段,这里发生了常量折叠(常量折叠就是在编译器进行语法分析时,将常量表达式求值计算,并用求得的值来替换表达式,放入常量表)。const int a = 10;声明并定义之后,编译器就知道了a的值,以后每次再出现a时就用10来替换,而不是去相应的地方去取值。
总结来说,编译时10已经取代了a,因此运行时a地址里存放的值虽然已经变了,但a依然代表着10这个常量。
Eg3:
int main()
{
const int a[3] ={2, 3, 4};
int * p = (int *) a; //偷梁换柱,和Eg2同一个道理
*p = 5;
printf(“%d\n”, a[0]);
printf(“%d\n”, a[0]);
}
注:C标准中,const定义的常量是全局的。
C++中,const变量是定义该对象的文件的局部变量,其他文件需要用extern显示的引用。即:
File_1.cpp
extern const int a = 1;
File_2.cpp
extern const int a;
2 常指针&指针常量&指向常量的指针常量&常引用
对于常变量、常数组、常对象、常引用,const与类型说明符或类名的位置可以互换,如const int a = 0;与int const a = 0;等同。然而const与指针或函数就要区分所放的位置了。
const只对它左边的东西起作用,如果左边没有东西,它才会对右边的东西起作用。根据这个规则来判断就会简单很多。
i 常量指针,表示这个指针是一个指向常量的指针(变量)。
const int *p;
int const *p;
p本身并不是const,在定义时不需要对它进行初始化。
注:
必须使用const void*类型的指针保存const对象的地址。不能用void*指针保存const对象的地址。
允许把非const对象的地址赋值给指向const对象的指针,但任何企图通过该指针修改其值的行为都会导致编译报错。
ii指针常量,指针本身不能修改,因此需要在定义时初始化。
int a;
int *const b =&a;
a的值是可以改变的。
这里增加一个知识点:引用。引用reference就是对象的另一个名字——《C++ Primer》。实际上,引用可以理解为一个指针常量。因此引用在定义时必须初始化,并且不能再将该引用绑定到别的对象上。
那么const引用是指向const对象的引用,也就是指向const对象的const指针。
iii指向常量的指针常量
const int a= 25;
const int *const b = &a;
Eg:
3 常对象&常成员函数
4 常函数
const用于函数时出现的三个位置:
const returnValfunction(const list_array) const;
第一个const的意思是:返回值是常量
第二个const的意思是:函数的过程中不能修改list_array的值
第三个const的意思是:函数过程不能隐式的修改function参数的值
参考多处资料,如有侵权,敬请告知,立马删除。谢谢