c和c++中const,指针和引用

本文详细对比了C89与C++99标准下const特性的不同定义及应用,包括const变量的初始化、使用限制及与指针、引用的结合方式,并探讨了这些特性对函数重载的影响。

一.不同标准下const特性
c语言所用的标准为C89;c++所用的标准为C++99,在这两个标准下,对const特性有不同的定义.
c89:
1.const为一个常变量,编译器将其当成一个变量进行编译。唯一与变量不同的地方是:不能将const作为左值来使用。我们知道,改变一个值的方式有很多中,const不能作为左值,但通过指针偏移访问const变量,依然可以改变const所修饰的变量的值。
2.const所修饰的变量不一定要初始化。

c++99:
1.const修饰的常量必须初始化。
2.并且可以作为数组名,数组下标来使用。
3.对该类变量编译时,以常量的方式进行编译,但在编译过程中,将用到常量名字的地方,全部替换成常量的值(这里有一个条件,是用到常量值的地方,常量名字被替换成常量的值,其他地方,如引用这个常量时,并不对该常量进行替换)
4.const修饰的常量可以被改变值,但其输出时,会被替换成初始值。
5.当const的初始值为一个变量时,就退化为常变量来使用(int b=0;const int a=b)
const特性:
1.不能作为左值。
2.不能间接的修改常量的值,会导致常量地址的泄漏(同引用)。

引用:两种作用,1是取地址,2是引用,区分其是取地址还是引用,看引用符号前面有没有类型,有类型则是引用,否则就是取地址,这也是引用一经初始化就不能更改的原因(另一个原因是,引用符号在编译的过程中会立马被解析成解引用来使用)。引用只有在c++11标准下有二级引用,其他目前都只用到一级。
另外引用有一下几个特点:1.必须初始化。2.不参与类型。3.对于内存地址不可泄漏的变量和立即数使用常引用。

引用和指针的相同点:在汇编过程中是一模一样的,都是两句代码,先从内存中取地址,再给取到的地址赋值。

引用和指针的不同点:1.定义的方式是不同的。
2.指针需要自己解引用,而引用在汇编时编译器对其自动解引用,可以说比指针安全方便了许多。

注意点:引用变量作为变量也需要占用空间,一般和指针类型占用的空间大小相同。
对指针解引用取得的是指针自己的地址,(int* p=&a,&p?)
对引用解引用取得是引用所引用变量的地址。(int &p=a,&p?)
上面的两个&p是不同的。

const和一级指针的结合点
对于const,编译器需要保证const修饰的值不能被直接或间接的改变。如果打算将一个常量的地址放到普通的指针中去,那就会发生错误
这里需要注意的点:

int const *p;
const int *P;
int * const p;
const int * const p;

这四个p变量的特点有什么不同?
1.第一个p和第二个p是一样的,const修饰的是int型,所以p自身可以变,但p所指向的数字不能变。
2.第三个p,自己不可以变,但其所引用的数字可以变。
3.最后一个是两个都可以变。
这里的诀窍是:查看离const最近的类型,那就是const所修饰的变量。const所修饰的变量永远都适用上面的两句话。
插入一个思考题:
int a=10;
int *p=&a;
const int **q=&p;
观察这三句话,想想第三句为什么编译出错,该怎么解决。
这里引用和指针的用法是一样的。

还记得函数重载需要的条件吗?
函数名相同,参数不同就可以构成重载(前提是重载函数是在同一个作用域下,本质原因是它们的符号产生是由函数名加参数列表构成的),在这里,参数不同主要是类型不同。const的参与是否会改变类型,这是一个重要的问题,如何看const是否参与类型?看const的右边是否有*,如果有那么const参与类型,如果没有,那么const不参与类型。
另外一个看函数参数的更改是否会修改值,对于重载函数来说,如果类型变了,那么这个函数构成重载,如果参数改变导致值发生改变,那么函数构成重载。

遇到含有指针和const修饰的变量之间相互赋值时,一定要牢记:
1.只有左右等式的类型相同时,才可以相互赋值。
2.左右等式类型不相等,但依然可以赋值的只有一种情况,等式的右边是普通变量,左边是const修饰的变量(可以想象成const对数据要求比较高,普通变量对数据要求比较低,高要求可以兼容低要求,而反过来不行)。

另外还有以下的小点需要牢记:
1.凡是由寄存器带出来的值或变量,它们都是立即数,举例如下:寄存器带出来以下三类变量:立即数(10)、指针变量(p)、引用变量(a),这三类变量如果其接受者和它们自身的类型相同,那么完全可以放心大胆的接收,但如果是将这三类变量的地址传递出去,那么必须使用一个安全的变量来接受,以防内存泄漏,也就是说要这三类变量自己是不能改变的,如果想要定义一个指针或引用来接受寄存器传出来的变量,那么这个指针或引用必须是const修饰的,否则会存在内存泄漏问题编译,导致无法通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值