深入学习C++关键字: const

96 阅读2分钟
关键字:
    const
    
const对象在创建后其值就不可更改,所以const对象必须初始化
如果const修饰的对象在编译时期就能确定其值
如:const int bufSize = 512; //函数外定义的(一般而言函数内定义的变量都是运行时期确定的)
那么所有用到bufSize的地方都会用512替换(这样编译器不会给它们分配额外的内存)
而:int getInt() {
        int a = 10;
        return a;
    }
    const int bufSize = getInt(); //依旧是函数外定义
    此时,由于getInt()只能在运行时期返回值,所以编译器要给每个用到bufSize的地方分配内存。

也正是因为这样的特性,const对象在默认情况下只在本文件内有效
顶层const与底层const1. 顶层const  //作用于对象本身
    2. 底层const  //不作用于对象本身
    
示例1const int i = 0; /*
                        顶层const
                        因为const作用的是对象i
                     */
    
示例2int a = 0;
    int* const p1 = &a; /*
                            顶层const
                            因为const作用的是对象p1
                        */
                        
    const int* p2 = &a; /*
                            低层const
                            因为const作用的是对象a(是对象p2指向的对象)
                        */
    

    所以,p1的值不可更改(不可改变指向),可以通过p1间接改变a的值
    p2的值可以更改(可改变指向),不可以通过p2间接改变a的值(但可直接改变a的值)
const引用

const引用中的const是底层const,需要注意的是顶层const对于引用而言是没有意义的。
因为引用的语法糖已经强制了引用对象是没法改变指向的

另外普通引用是没法指向右值的(因为右值不可寻址)
如:int& a = 7;       //这是错误的,7没有内存
而:const int& a = 7; //正确,但不推荐使用
能做到的原因是:
    int temp = 7;        //编译器自己创建了一个匿名对象(我们无法得知它的名字)
    const int& a = temp; //让a引用这个匿名对象
补充:
    被mutable关键字修饰的对象,可以摆脱const的束缚