C++ 顶层const和底层const

顶层const和底层const

当我们定义指针和变量的时候,有时候希望定义成const型,就是不希望程序中改变自己定义的变量,一旦有代码试图改变定义好的const型的变量,在编译的时候就会直接报错。

指针本身也是一个变量对象,指针所指的变量也是一个变量对象。当定义const int *p = &i的时候是指针不可变还是变量i不可变呢?这就涉及大了顶层const和底层const的概念。如下的定义方式,有些是顶层const,有的是底层const:

int a = 10;
int *const p1 = &a;//pi的值不可变,a的值可变。顶层const
const int b = 20;//变量b的值初始化为20后就不再变化,顶层const
const int c = a;//正确,顶层const,c不可变
const int *p2 = &b;//p2本身的值可变,p2所指向的b不可变,底层const
const int * const p3 = &b;//靠右侧的const是在描述p3本身不可变,为顶层const,靠左侧的const描述的是p3所指的对象是否可变,为底层congst
const int &r = b;//当使用引用的时候,都是指所引用的对象是否可变,为底层const

即对于指针和普通的变量而言顶层const是指所定义的指针本身或变量本身不可变,指针的底层const指它所指的对象是否可变。引用都是指所引用的对象是否可变,为底层const。

const int a = 10;
int b = 20;
int c = a;//正确,const型可以赋值给非const型,a本身并不受影响
const int &r = b; //正确,非const的b可以被引用成const型
int &r1 = a;//错误,const型a只能被const型引用
int * const p = &a;//错误,p所指的对象是可变的,但a是const的。

一点理解就是要明确const是描述了哪个内存单元中内容不可变,要保证内存单元中的数据不变,则指向该内存单元的指针就必须是const,引用该内存单元的引用也需要是const的。

定义一个c++ class,并且定义const型的类和指针如下:

#ifndef PERSON_H
#define PERSON_H

#include <string>

class Person
{
public:
    explicit Person(std::string name) : name_(name),age_(0) {}
    void setAge(int age){age_ = age;}
    std::string getName()
    {
        return name_;
    }

private:
    std::string name_;
    int age_;
};

#endif

在主程序中定义

const Person A("Jack");
Person *B = &A;//错误
const Person *C = &A;//正确,指针C的值可变,但C所指的对象A中的内容不可变
C->setAge(10);//错误,试图改变一个不可变的内存中的内容
const Person * const D = &A;//正确
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值