C++中const要点整理

1、C++中的const默认为内部连接,也就是说,const仅在被定义过的文件里才是可见的而在连接时不能被其他编译单元看到。

连接的原理?

2、定义一个常量(const)时,必须赋一个值给它。

const int a1;//编译错误,没有进行初始化,可以用extern关键字进行声明

const int *a2;//编译警告,a2是一个指向int常量的指针,它可以指向任何符合条件的地址,所以可以不用初始化

3、C++编译器通常并不为const分配存储空间,相反他把这个定义保存在他的符号表里。

对const变量进行取址运算时会分配内存

用extern关键字声明的常量会分配内存

在编译期间初始值不能被确定的常量会分配内存,例如:通过cin.get()从外部接收字符赋给常量

复杂结构的常量在初始化时会分配内存

4、当const被使用时,它在编译时会进行常量折叠。

常量折叠:将常量或常量表达式的值直接替换到所在的位置,效果相当于预编译宏的功能。对于那些初始化时分配了内存的常量不能进行常量折叠。

5、可以把一个非const对象的地址赋给一个const指针(不想改变某些可以改变的东西);不能把一个const对象的地址赋给一个非const指针(不想被改变的东西可能被改变了)

一切以安全为重,安全级别可以升高但不能降低。可改->不可改(OK),不可改->可改(NG)

6、char *cp="Hello World";cp[1]='a';在编译时没有问题,但在运行时发生异常。

char *cp后系统只给cp分配了一个地址,并没有分配保存字符串的内存。系统为"Hello World"在常量区分配了内存,将地址赋给cp。也就是说cp此时指向的是常量区的地址,如果此时试图改变常量区的内容就会发生异常。如果用char cp[]="Hello World";的方式声明则不会发生上述问题,因为在声明cp时已经分配了内存。

待续。。。

 

PS:蓝色字体部分摘自《Thinking in C++》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值