一、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成员函数中修改成员变量的值了
五、一些例子
5.1 当const修饰指针
示例1:
const char *const *p;
这是一个二级指针,可以看到const在*号的左边,于是这个二级指针指向的是一个常量,内容不可修改,但是二级指针本身可以修改。
示例2:
const char const *p;
可以看到const在*号的左边,于是该指针指向的内容是常量,它是一个指向const char的指针
示例3:
const char * const p;
可以看到const在*号的右边,于是它是一个常指针,指向const char
5.2 当const用于常对象成员
示例1:
常对象成员只能在初始化列表赋值
注意:常量必须要在构造函数的初始化列表里面初始化或者将其设置为static!
因此,正确的形式应当是:
或者
5.3 当const用于成员函数
示例1:
此时可以用于区分重载函数,常对象只能调用常成员函数
5.4 当const用于函数参数和返回值
示例1:用于函数参数时
示例2:用于函数返回值时
本文详细介绍了C++中const关键字的使用,包括const修饰变量、指针、引用和成员函数的不同情况,探讨了const与#define的区别,并通过实例解析了const在不同场景下的应用,帮助开发者更好地理解和利用const特性。











&spm=1001.2101.3001.5002&articleId=84798970&d=1&t=3&u=f7df06edd1de4c578ee00ed0cf5d74bf)
1万+

被折叠的 条评论
为什么被折叠?



