美文网首页C++C++
笔记07:C++中的const

笔记07:C++中的const

作者: Wayne_Dream | 来源:发表于2018-11-17 11:48 被阅读0次

    1,const 限定符

    const int i = 0;,使用const可以将i变成一个常量,当试图对i的值进行修改时,会引发报错,需要注意的是,必须对const对象进行初始化,当然,初始化的值可以是任意复杂的表达式。也可以用一个对象去初始化另一个对象,它们是不是const都无关紧要,因为一旦拷贝完成,新的对象和原来的对象就没有任何关系了。

    在默认状态下,const对象仅在文件内有效,当多个文件中出现同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。如果想要在多个文件中共享const对象,必须在变量的定义之前添加extern,如extern const i = 0;


    2,const的引用

    2.1,可以把引用绑定到const对象上,称之为对常量的引用,与普通引用不同的是,对常量的引用不能被用来修改它说绑定的的对象:

    const int i = 2;
    const int &j = i;  //常量引用
    j = 3;    //error,对常量的引用不能修改。
    int &k = i;    //error,试图让一个非常量引用指向一个常量对象。
    

    2.2,当一个常量引用被绑定到另外一种类型上时:

    double i  = 1.55;
    const int &j = i;
    // 当i 改变时,j也会改变
    

    当引用对象与被引用对象类型不一致时,编译器会产生一个临时量

    const int temp = i;         //由双精度浮点数生成一个临时的整型常量
    const int &j = temp;    //让j绑定这个临时量
    

    2.3,当然,我们必须认识到,常量引用仅对可参与的操作做出来限定,对引用的对象本身是不是常量未作限定,因为对象也可能是个非常量,所以C++允许通过其他途径改变它的值:

    int i  = 3;
    int &j = i;
    const int &k = i;
    j = 0;
    
    >>>  i = 0 , j = 0 , k = 0
    

    可以看到const引用的k发生了变化,并不是3,而是0。


    3,指针和const

    与引用一样,指向常量的指针,不能用于改变其所指对象的值,即要想存放常量的指针,只能使用指向常量的指针:

    const double pi = 3.14;
    double *ptr = π   //错误,ptr是一个普通指针,必须用常量指针指向常量。
    const double *cptr = π    //正确
    *cptr = 42;  //错误,不能给*cptr赋值
    

    所谓指向常量的 指针或引用,不过是指针或引用“自以为是”罢了,它们觉得 自己指向了常量,所以自觉地不去改变所指对象的指,其实可以使用别的方式来改变。

    int i = 0;
    int *const j = &i;  // j将一种指向i,即不变的是指针本身,而非指向的那个值
    
    const double pi = 3.14;
    const double *const pip = π //pip是一个指向常量对象的常量指针
    

    4,constexpr变量

    在复杂系统中,很难分辨一个初始值到底是不是常量表达式。就像const int sz = get_size();,sz就不是一个常量表达式,因为get_size()的具体值只有在运行时才能得到。所以在C++11中,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化

    constexpr int mf  = 20;  //20是常量表达式
    constexpr int limit = mf +1;  //mf+1是常量表达式
    

    相关文章

      网友评论

        本文标题:笔记07:C++中的const

        本文链接:https://www.haomeiwen.com/subject/todbfqtx.html