1. 核心

const的本质是恒值,恒定不变的。也就是说,期望值不发生变化,保持恒定,这里的值通常是变量的值,当然,对象也可以理解为一个特殊的变量,也可以为指针的值。

如果能理解上面的内容,剩下的就是语法和逻辑的问题,下面逐一介绍。

2. 语法

const相关的语法
说明语法示例
常变量定义一个常变量const 类型 变量名const int a;
常函数定义一个函数为常函数类型 函数名() const        int fun() const
常指针定义一个指针为常指针类型 * const 指针名         int * const p;
指向常量指针     定义一个指针,指向常量const 类型 *指针名const int *p;或者 int const *p;
指向常量的常指针 定义一个常指针,指向常量const 类型 * const 指针命令const int * const p;
常对象定义一个对象为常对象const 类名 对象名const Time t1;或者 Time const t1
常对象指针定义一个指针指向常对象const 类名 * 指针名const Time * pt1;
对象常指针定义一个常指针指向对象类名 * const 指针名Time * const pt1;
类常成员定义一个类的常成员同常变量定义
类常函数定义一个类的常函数同常函数定义

3. 注意

3.1 const的位置

const 可以放在很多位置,但是需要注意的是,它一定是修饰离它最近的成分,典型的:

        const int *p;表示的是指向常量的指针,这里的变量是常量,而指针是变量,换句话说:p=&a;p=&b;都是可以的,但是,*p=5,就会报语法错误;

        int * const p;表示的是指向变量的常指针,这里的指针是常量,而其指向的变量是可变的,换句话说,p=&a;p=&b;语法会错误;,但是,*p=5,就是ok的。

3.2 常对象,常成员函数,常成员变量间关系

        常对象,只能调用常成员函数,这是因为,非常成员函数,可以改变类的成员值,这与常对象的要求是不相符的,其它的根据const的定义来确定。

        原理:

  • 常成员函数(如 void display() const;)在内部被视为接受一个 const 类型的隐式指针 this。

    • 对于非常成员函数,隐式指针是 Time* this。

    • 对于常成员函数,隐式指针是 const Time* this。

    • 根据指针的 const 规则(指向常量的指针),const Time* this 意味着你不能通过 this 指针去修改它指向的对象(即该常对象)的任何数据。

  • 非常成员函数(如 void setHour(int h);)接受的是一个非 const 类型的隐式指针 (Time* this)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐