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的全局变量,放在全局存储区。
    陈小洁的三只猫
  • 相关阅读:
    IP地址和进制转换
    Cisco交换机常见配置
    macOS上的autoreconf错误导致无法安装问题
    LG P5147 随机数生成器
    LG P1879 [USACO06NOV]Corn Fields G
    LG P5017 [NOIP2018]摆渡车
    mysql触发器trigger详解
    MybatisPuls中QueryWrapper的select、update的用法
    @Transactional各属性详解
    Linux如何查看进程、杀死进程、启动进程等常用命令(包括常用的命令,如查看文件,修改文件读写权限、寻找文件等)
  • 原文地址:https://www.cnblogs.com/ccpang/p/11375414.html
Copyright © 2011-2022 走看看