关键字const

单纯的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参数的值


参考多处资料,如有侵权,敬请告知,立马删除。谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值