关于C/C++的限定符const

来源:互联网 发布:nars和mac豆沙色哪个好 编辑:程序博客网 时间:2024/05/17 00:54

首先声明,这是我个人的第一篇博客,可能有一些缺陷,希望能为大家稍微提供一些帮助。

        const作为C/C++的关键字,用于对变量的类型加以限定,而当出现一些比较复杂的const的使用的时候,很多人就会因为const而对整个程序的阅读产生一些问题,所以下面我给大家介绍一下const关键字的一些使用规范和方法。

        首先,const它的作用是限定变量类型,使得被限定的变量成为常量,任何试图为变量赋值的行为都将引发错误,如下:

        const  int  a=12;

        a=1;         //错误:试图向const对象写值

    基于上面出现的错误,可以知道const对象一旦创建后其值就不能改变,故const对象必须初始化 。初始值可以是任意复杂的表达式。


有关于const的引用:

        1.常量引用是对const的引用,常量引用只是一个简称,严格来说,并不存在常量引用。因为引用不是一个对象,所以我们没法让引用本身恒定不变。

        const  int  ci = 1024;

        const  int &r1 = ci;       //正确:引用及其对应的对象都是常量

        int  &r2 = ci;                 //错误:试图让一个非常量引用指向一个常量对象

        2.初始化对const的引用

        引用,大家都知道引用的类型必须与其所引用的对象的类型一致。但这里有一个例外,初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。

        int  i = 42;

       const  int  &r1 = i;

       const  int  &r2=42;

       const  int  &r3 = r1 * 2;

    以上的几条语句都是正确的,编译器在进行编译的过程中会对以上代码做以下调整,例如第3条语句:

       const  int  temp = 42;

       const  int  &r2 = temp;

大家可能会不理解为什么会写成这样,这是因为代码本身没有改变,而编译器是上面那样认为的,这里的temp只是一个临时量。

       所谓临时量对象就是当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象。而程序员们一般把临时量对象简称为临时量。这样上面对const引用的初始化就很好理解了。

       3.对const的引用可能引用一个并非const的对象,这个可以这样理解,当对const的引用绑定的是一个并非const的对象,那么就不能通过常量引用来改变该对象的值,但是该对象的值可以通过其他方法来改变。如下示例:

       int  i = 42;

       int  &r1 = i;

       const  int  &r2 = i;

       r1 = 0;    //正确:r1并非常量,i的值修改为0

       r2 = 0;    //错误:r2是一个常量引用


有关于const的指针:

我想大家应该很多人会遇到下面的问题,那么我就通过下面的问题来解释有关于const的指针。

        const  int  *p;

        int  const  *p;

        int *const  p;

        const  int  *const  p;

第一种和第二种是同一种情况,因为类型关键字和const关键字可以互换位置,它表示的意思是指向常量的指针,可以理解为这个指针不能改变其所指对象的值,但是可以改变指针的指向。要想存放常量对象的地址,只能使用指向常量的指针。

第三种情况表示的是p是一个常量指针,p的指向不能改变,但是p所值的对象的值可以通过其它方式改变。常量指针必须初始化。把*放在const之前用以说明指针是一个常量,意味着不变的是指针本身而非指向的那个值。

第四种情况表示的是p是一个指向常量对象的常量指针,指针和它所指的对象的值都不能改变,当然它等价于int  const  *const  p;。

而有些时候会有人问const  int  const  *p;所表示的含义,我只能解释这是一种错误的语法,可以认为是int const const *p;这样就好理解了,编译器会认为你的const是重复使用,所以它会报错。


要想弄清楚这些声明的含义最好的方法就是从右向左阅读,如上面第四条语句,p是定义的一个变量,再往前就是*const,它表示p是一个常量指针,再往前是int,表示p是一个指向整型的常量指针,再往前是const,表示p是一个指向整型常量的常量指针。这样是不是就很快可以读懂语句了?



       

    

    

                                             
0 0
原创粉丝点击