C和C++中的const

作者: 秦素先生 | 来源:发表于2019-05-13 11:38 被阅读0次

    author: 冰小苏打

    const 必须初始化

    const 作用

    1.修饰变量,说明该变量值不可以被改变2.修饰指针,分为指向常量的指针和指针常量;3.常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改(严格来说并不存在常量引用,因为引用不是一个对象)4.修饰成员函数,说明该成员函数内不能修改成员变量。

    C中const

    严格来说C中的const是假的const

    //常量 a 不能改变
    const int a = 12;    
    a=18;    //错误
    int *p1 = &a;//c中普通指针可以指向常量
    ​
    printf("a:%d\n", a);  //12
    //间接修改a的值
    *p1 = 13;
    printf("a:%d\n", a);  //13
    ​
    // c中的const 是伪const
    ​
    int b = 16;
    ​
    ​
    //指向常量的指针 p3指向地址的内容不能变
    const int * p2 = &b;    
    *p2 = &b;    //错误,编译不通过,指向地址的内容不能变
    p2 = &a;    //可以,改变指向的地址
    //类似。可以使用2级指针改变p2的指向地址的内容
    //so c中的const 是伪const
    ​
    int * const p3 = &b;     //指针常量 p2 不能改变指向的地址
    *p3 = 18;    //可以,改变指向地址的内容
    p3 = &b;    //错误,编译不通过,不能改变指向的地址
    ​
    //类似。可以使用2级指针改变p3的指向的地址
    //SO  c中的const 是伪const
    

    SO c中的const 是伪const

    C++中const

    //初始化
    const int a =12;
    const int b = a;
    int c =13;
    const int d = c;
    const int e = sizeof(a);
    const int f = get_size();
    ​
    a = 18;    //错误,常量不可变
    ​
    //错误,a是常量,只能使用常量指针指向和C不用
    int *p2 = &a;
    ​
    //OK 使用常量指针指向
    const int * p3 = &a;
    ​
    //错误,这是一个常量指针
    int * const p4 = &a;
    ​
    //ok  指向常量的常量指针,指针本身和指向地址的内容都不可变
    const int * const p5 = &a;
    ​
    

    常量引用

    • 经常用于形参类型
    //常量引用,严格来说C++并不存在常量引用,因为引用不是一个对象
    const int &aa = a;
    aa++;    //错误,不能改变
    ​
    //用于形参类型
    //减少参数传递过程中的变量的拷贝
    ​
    int add(const int &a, const int &b)
    {
        return a+b;
    }
    

    修饰成员函数

    class A
    {
    public:
        int a = 12;
        int b = 13;
        int  modify_a() const
        {
            this->a = 18;//错误,const 函数不能对成员进行修改
            this->b = 20;//ok    mutable  修饰的成员不受const函数的限定。
        }
        int  modify_b() const
        {
            this->a = 18;//错误,const 函数不能对成员进行修改
        }
    ​
        int const  modify_c()    const 修饰的是函数的返回值为const 
        {
            this->a = 18;//OK  
            this->b = 18;//OK
        }
    ​
    };
    

    顶层const,底层const

    • 顶层const表示指针本身是个常量,它的值(指向的地址)不能变。•底层const表示指针指向的是常量,它指向的地址空间的值不能变。

    constexpr 变量

    • 申明为constexpr的变量一定是一个常量, 在编译期间就能得到的值。

    更多内容欢迎关注公众号:冰镇小苏打

    相关文章

      网友评论

        本文标题:C和C++中的const

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