C++之const修饰符

const类型修饰符其实是C++中新引入的,其使用类似于C语言中的deifne关键字,不废话直接讲。

const应用场景有以下六种,掌握了这六种场景,以后见到const就不怵了。

(一)const变量

    const int a = 1; //定义时赋值

    对变量a进行修饰,表示a是const类型的,需要定义是赋值,而且后面不能再赋值,可以赋值给变量;

        int a = 1;

        const int b = a; //定义时赋值,”const int b“编译会报错

        b = 2; //error,不能修改const类型的值,其值在定义时就确定了   

(二)const引用

    const修饰引用,看const和&的位置,表明引用值是不能修改的;

    场景一:

    int a = 1;

    const int& b = a; //等价于int const & b =a ;看const和&位置,表明是修饰int&类型的

    b = 2; //error,b是const引用类型,其值不能改

    a = 3; //可以通过修改a间接修改b,此时b等于3

    场景二:

    int & d = 1; //error,1可以看作是一个const类型,报错原因参考CC定律

    const int &d = 1; //OK

(三)const指针

    const指针主要通过看const和*的位置来区分不同的应用场景

    场景一:

    const int* a = &b; //等价于int const * a; const修饰*a,即*a不能做左值

    *a = 1; //不能当左值

    场景二:

    int* const a = &b; //const修饰a,a不能做左值

    a = &c; //不能当左值

    场景三:

    const int* const a = &b; //等价于int const* const a = &b; *a, a都不能当左值

    *a = 1; //不能当左值

    a = &b; //不能当左值

    上面只列出了不能当左值的例子,当然只要没说的都可以当左值啦。

(四)const函数形参

    主要通过形参与实参之间的调用关系来划分不同应用场景

    场景一:

    形参不是const类型时,不管实参是不是const类型,随便调

    void func(int a);

    const int b = 1;

    func(b); //OK

    场景二:

    形参是const类型时,如果不是指针或引用,不管实参是否是const类型,随便调

    void func(const int a);

    int b = 1;

    func(b); //OK

    形参是const类型时,如果时const指针或引用,实参必须是const类型指针或应用,否则编译失败(参考CC定律)

    void func(const int* a);

    int* b = &c; //应该改为const int* b = &c;同理const int& b = c;

    func(b); //error

(五)const函数返回值

    const修饰返回值,如果是非指针类型,则忽视const存在

    const int func();

    int a = func(); //OK

    const修饰返回值,如果是指针或引用类型,则必须用const指针或引用来接受此返回值(参考CC定律)

    const int* func();

    int* a = func(); //error,应改为const int* a = func();同理const int& a = func();

(六)const类成员函数

    const修饰类成员函数,不能修改成员变量值,只能调用const同类型成员函数,注意const位置,写在成员函数后面,就表示此函数是const成员函数,记住上面说的两点一点问题没有

    void A::func(int a, int b) const;

    原理是this指针的引入,其实所有的类成员函数都包含一个隐士的this指针调用

    void A::func(A* this, int a, int b); //通过*this.private来调用私有成员变量,如果是const成员函数其显示形式为:

    void A::func(const A* this, int a, int b) const; //显然此时*this不能修改其值,当然为了不通过成员函数间接修改成员变量的值,只能调用const同类型成员函数

CC定律:const指针和引用相关的问题都可以用下面两条来解释
-)const int* a = &b;//b为const类型,a指针必须是const类型(很显然a,b指向同一段内存空间,b是const类型,即b的值不能修改,但是如果a不是const类型指针,可以通过修改*a间接修改const类型的b的值,所以这里*a必须也是const类型的)
-)const int& a = b;//b为const类型,a引用必须是const类型(很显然a是b的别名[其实质也是a,b指向同一段内存空间],b是const类型,即b的值不能修改,但是如果a不是const类型,可以通过修改a间接修改const类型的b的值,所以这里a的引用必须也是const类型)

满满的干货,所有const应用场景!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值