码农的世界C / C++

C和C++中的const

2019-05-13  本文已影响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

constexpr 变量


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

上一篇下一篇

猜你喜欢

热点阅读