美文网首页
C++数据类型(四)const常量

C++数据类型(四)const常量

作者: 山羊歌的演唱会 | 来源:发表于2018-06-05 18:35 被阅读0次

    const常量

    const常量:值无法被改变的变量

    关于const的一些规则

    //创建之后必须初始化
        const int bufSize = 1024;
        const int a = get_a();
        const int b;    //错误,没有初始化
        bufSize = 1024; //错误,常量不能赋值
    

    const的引用

    • 与可变变量的引用不同的是,对常量的引用,不能用作修改其所绑定的常量。
    • 初始化常量的引用时允许用表达式作为初始值,但左右两边类型相同,但变量不行
    const int bufSize = 1024;
    const int &a = 512; //错误,不能修改绑定的常量的值
    const int &b = bufSize * 3; //正确
    int &c = bufSize * 3;     //错误,非常量引用必须为左值
    

    至于最后一条语句:使用表达式对变量引用报错,解释如下:
    试想如下语句:

    double d = 3.14;
    const int &rd = d;
    

    对于这种引用,编译器工作如下:

    double d = 3.14;
    int temp = d;
    const int &rd = temp;
    

    rd只是绑定了一个临时变量temp,如果rd不是常量是变量呢?那么就允许对rd赋值,但是对rd赋值改变的是临时变量的值,之所以有变量引用,无非就是想通过引用改变绑定变量的值,如著名交换函数swap(),但是对于出现中间临时变量的这种情况,无法达到上述要求,那么引用也无任何意义,所以,编译器对于变量引用使用表达式初始化报错。

    指针和const
    与常量的引用类似,也存在指向常量的指针,同样也不能通过指针改变常量的值。

    const int a = 4;
    int *b = &a;
    
    • const指针
      与引用不同,指针是作为对象出现的,允许把指针作为常量,即常量指针。同样,常量指针必须初始化,一旦初始化成功,不能修改,指针常量的定义如下:
    #include<iostream>
    using namespace std;
    int main() {
        int bufSize = 1024;
        int bufSize2 = 512;
        //定义一个常量指针
        int *const rbuf = &bufSize;
        //rbuf = &bufSize2; //错误:表达式必须是可修改的左值
        cout << *rbuf << endl;
        bufSize = 2048;
        cout << *rbuf << endl;
        system("pause");
        return 0;
    }
    //输出结果
    1024
    2048
    

    关于常量的引用或者指向常量的指针,一直搞不明白有什么用,既然不能那个改变,为什么还可以引用或者使用指针呢?

    constexpr和常量表达式

    常量表达式指不会改变而且在编译过程中就能计算出结果的表达式
    字面值属于常量表达式,用常量表达式初始化的常量也是常量表达式。

    const int num = 20;             //num是常量表达式
    const int number = num + 1;     //number也是常量表达式
    int a = 3;                      //a不是常量表达式
    const int size = size();        //size不是常量表达式
    

    C++11新标准:
    允许将变量声明为constexpr类型,编译器验证变量是否是一个常量表达式

    constexpr int num = 20;             //num是常量表达式
    constexpr int number = num + 1;     //number也是常量表达式
    constxpr int size = size();         //size不一定常量表达式,size()是constexpr函数时,语句正确
    

    同样的,constexpr对于指针同样有效,相当于声明了一个常量指针

    const int *p = nullptr;            //p是指向整型常量的指针
    constexpr int *q = nullptr;       //q是常量指针
    

    相关文章

      网友评论

          本文标题:C++数据类型(四)const常量

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