c/c++中const的区别

论c和c++中的const

1.前言

​ const是construct的缩写,是c/c++语言中的类型限定符,采用const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。

但c和c++中的const本质上却有区别。

2.c中的const

​ 在c语言中,用const定义一个常量的时候,编译器会直接开辟一个内存空间存放该常量,不会进行优化。 并且当我们用一个指针去指向该变量的时候我们是可以对该变量进行修改的。例如:

int main()
{
    const int a  = 2;	//此时a=2
    int* p = (int*)(&a);
    *p = 3;//通过指针对a进行修改,此时a=3
    printf("%d",a);
}

​ 因此,在C语言中的const是“假常量”,用const修饰一个变量的时候,会为该变量开辟一个空间,我们可以利用一个指针去指向该变量,然后间接修改该空间的值。但c++中却不是这样。

3.c++中的const

i.与c语言的区别

c++中用const定义了一个常量后,不会分配一个空间给它,而是以key-value(键值对)的形式写入符号表(symbol table),这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

​ 这个特性令c++中的const修饰变量时类似于宏定义#define,例如:

//二者在程序正常运行的状况下,功能相同
#define a 10  //在预处理阶段,将所有的a替换成10
const int a = 10; //在编译阶段,会进行语法分析等编译操作

​ 因此c++中const修饰的变量是“真常量”,而c++中也不允许对一个常量取地址。如果对const修饰的变量取地址,编译器会临时开辟一个栈空间,让这个指针存放这个临时空间的地址。因此通过指针去修改const变量,是修改该临时空间中的值,例如:

int main()
{
    const int a  = 2;//以key-value键值对的形式写入符号表
    int* p = (int*)(&a);//临时开辟一个栈空间tmp
    *p = 30;//对tmp修改变量,与a无关
    cout<<a<<endl;
    cout<<*p<<endl;
}

ii.const修饰指针

​ 在c++中,const修饰指针变量时,const在代码中位置不同,修饰涵义也不同,分为顶层const和底层const。

​ 顶层const,表示指针本身是个常量

​ 底层const,表示指针指的对象是一个常量

int i = 0;
int *const p1 = &i;//不允许改变p1指向的地址(&i),但是可以改变i的值(顶层指针)
const int *p2 = &i;//允许改变pi指向的地址,但是不可以改变i的值(底层指针)
const int *const p3 = &i;//靠右的是顶层,靠左的是底层

iii.const修饰引用

​ 引用本质上是一个常量指针,在编译过程中对一个引用操作赋值时会隐藏*,

int i = 0int &a = i;
a = 300;//对一个引用操作赋值的时候,编译器替我们隐藏*操作

//因此若用const修饰一个引用变量
const int &b = i;//等价于const int *const p = &i;
b = 100//编译器会报错,无法修改
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值