zoukankan      html  css  js  c++  java
  • 2变量与基本类型之const限定符


    一、const介绍:

      const对象一旦被创建其值就不能再改变,所以const对象必须初始化。任何试图对const赋值的行为都会引发错误。


    二、初始化和const:

      对const对象的主要限制就是只能在const类型的对象上执行不改变其内容的操作。

    int i  = 42;
    const int ci = i; //正确,i的值被拷贝给ci
    int j = ci;  //正确被拷贝给j

     以上操作都是被允许的,ci的常量特性仅仅在执行改变ci的操作时才会发挥作用。记住拷贝一个对象的值并不会改变它。


    三、默认情况下,const对象只在文件内有效:

      当我们定义了如下代码时:

    const int i = 23;

       编译器将在编译过程中把文件内的变量i全部替换成23,所以默认情况下const对象只对文件内的i有效。当其它文件中也有const i的定义时,认为是两个相互独立的变量。

      如果想在多个文件之间共享const对象,则必须在变量的定义之前添加extern关键字。


    四、const的引用:

      绑定到const对象的引用称为对常量的引用(reference to const)

    引用(reference)的类型必须与所引用对象(object)的类型一致。但是有以下两个例外:

    • 允许用任意表达式作为初始值,只要该表达式能够转换成引用的类型即可。

    五、顶层和底层const:

      顶层const是说指针本身是个常量,底层const是表示指针指向的对象是个常量。

       顶层const可以表示任意对象的对象是常量,比如算术类型、类、指针等。当执行对象的拷贝时,顶层const不受影响。你想想顶层const的意义是什么?它就是一块内存,这块内存里存的东西不能再改变,但是可以把这块内存复制给另一块内存。至于常量指针,是在栈上开辟的这块内存(4bytes)不能再指向其他的地址,但是这块地址可以拷贝啊。

      

    1 const int ci = 23;
    2 const int *p2 =  &ci;
    3 const int * const p3 = p2;
    4 
    5 p2 = p3;

    例如上述代码:

    • 在全局存储区上开辟了一块内存存放const int变量ci.
    • p2是在全局存储区开辟的一块内存,它是指向const int的指针,指向的地址是ci。它可以指向其他的地址。
    • p3是在全局存储区开辟的一块内存,它是指向const int的常量指针,指向的地址是ci,它不可以指向其他的地址。
    • 现在我们让p2 = p3,就是把p3的指针值(指向的地址值)拷贝给p2,虽然p3是一个常量指针,但是拷贝对于顶层const对象完全可以啊,这个const限定只是说你不能再指向其他的地址,并不意味着你不能被拷贝给其他的内存。

    再看一下在底层const执行拷贝操作:

      

    1 int *p = p3;
    2 p2 = p3;
    3 p2 = &i;
    4 int &r = ci;
    5 const int &r2 = i;
    6 int i = 0;

    例如上述代码;

    • p3是一个指向p3的指针,p3又是指向const int object的指针。  
    • 第三行:让p2指向i的地址是正确的,因为p2是个指向常量对象的非常量指针,所以它可以改变指向的地址,由于i是个非常量对象,但是i可以转变成const int*
    • 第四行:由于ci是个常量对象,但是r却是个非常量指针,你一个指向非常量的指针去指向一个常量对象的地址,显然是不行的,因为你此时能够通过该指针去改变常量兑现的的值,但是常量对象的值显然是不能被改变的。
    • 第5行:你r2是一个对常量的引用,但i是个非常量对象,很明显你i可以转化成常量对象。所以你r2可以指向i.

    永远记住:指向非常量类型的指针可以转成指向常量的指针,


    六、const的存储:

    • 对于const全局常量,如果初始值是字面值常量,一般会存放在常量存储区
    • 非static 的 const局部变量,如果需要内存空间也是在中进行分配
    • 对于static 的 const局部变量(如函数中),会根据编译器的优化能力,以及初始值,来决定其是不进行存储,还是直接存储在常量符号表,或者是栈中等等均有可能。
    • 对于const的全局变量,放在全局存储区。
    陈小洁的三只猫
  • 相关阅读:
    51 Nod 1068 Bash游戏v3
    51 Nod Bash 游戏v2
    51 Nod 1073 约瑟夫环
    UVA 12063 Zeros and ones 一道需要好好体会的好题
    51 Nod 1161 Partial sums
    2018中国大学生程序设计竞赛
    UVA 11971 Polygon
    UVA 10900 So do you want to be a 2^n-aire?
    UVA 11346 Possibility
    python with as 的用法
  • 原文地址:https://www.cnblogs.com/ccpang/p/11375414.html
Copyright © 2011-2022 走看看