C/C++11 const

    关于const,在前面关于《C/C++程序内存分布》已经又提到过。但是,这里一定要指出的是现在的C++的const实现和C的const是不一样的。
    比如对于如下的程序,以下程序对于C语言来说是不合法的(补:可能也合法,因为目前的C已经支持变量数组长度了,C现在甚至可以用变量定义数组长度。。。),但是对于C++却毫无问题。

#include <stdio.h> 
#define LENGTH 10
const int length = 20;

int main()
{
    const int length2 = 10;
    int arr[length] = { 0 };
    int arr2[length2] = { 0 };
    return 0;
}

    其原因在于:C语言中的const是常变量,它本身是变量,其本身是占内存的,只是被限制了不可变(ps:全局const由操作系统保证,局部const由编译器保证)。而arr的长度在编译期就必须确定。因此编译发生错误;而C++不同,C++对const作了优化,编译器内部实现了一个const符号表,因此它是一个真正意义上的常量!而且这个常量还有一些特殊的性质:它可能分配存储空间,也可能不分配存储空间,当const常量为全局,并且需要在其它文件中使用时,分配空间。当使用&操作符取const常量取地址时,分配空间,而其他情况不分配空间。
    一般程序设计是只要设置了const,都不会去强行改动其值(比如拿到其指针,或const_cast)。强行修改const变量在C++中是一种未定义行为,不同编译器由于实现方式,或同一编译器是否发生优化都将可能会导致输出结果不同。这里指的是局部const变量(栈),对于全局const变量,其不可变性是由操作系统保证的,这对于C(只读常量区)和C++(const表)来说都无法修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值