C++小知识——const详解

一、const的基本使用情况

使用情况 格式
常变量 const 类型说明符 变量名 (可互换const和类型说明符)
常引用 const 类型说明符 &引用名(可互换const和类型说明符)
常对象 类名 const 对象名(可互换const和类型说明符)
常成员函数 类名::函数名(形参表) const
常数组 类型说明符 const 数组名[大小](可互换const和类型说明符)
常指针 类型说明符 const *变量名

二、const修饰指针的情况

首先定义了一个整型变量b并给它赋值100

情况1:const位于*号的左侧,与const放在变量声明符中的位置无关

const int *a = &b;等价于int const *a = &b;
这种情况下,const就是用来修饰指针所指向的变量,即指针指向为常量
这样,可以先不进行初始化,因为虽然指针的内容是常量,但指针本身不是常量。const int *a;是正确的。

举个例子:假如a是一个仓库管理员,他所管理的仓库里面的货物他是没有权限去动的。
在这里插入图片描述
但是,也有两种办法去改变仓库里面的值:
最直接的当然是直接改变变量b的值了
在这里插入图片描述
间接的方法就是让a指向另外一个变量
在这里插入图片描述

情况2:const位于*号的右侧,const修饰指针本身,即指针本身是常量

int* const a;这种情况下不能对指针本身进行更改操作,而指针所指的内容不是常量
由于指针本身是常量,所以一定要在定义的同时进行初始化
在这里插入图片描述
在这里插入图片描述

情况3:星号的左右两侧都有,指针本身和指针指向的内容都是常量

const int* const a = &b;


三、与#define的区别

虽然它们都可以定义常量,但是const比#define有更多的优点:

  • const常量有数据类型,而宏常量没有数据类型。
    因此编译器可以对前者进行安全检查,而只对后者进行字符替换,而且在替换过程中可能有边际效应
  • 有些调试工具可以针对const进行调试,而不能对宏常量进行调试

四、如何修改常成员函数中类的成员变量

在类的成员变量中,用mutable修饰成员变量名后,就可以在const成员函数中修改成员变量的值了

猜你喜欢

转载自blog.csdn.net/CSDN_dzh/article/details/84798970