const类型限定符
const type qualifier.
const类型限定符
注:变量、类对象、类实例 统称为变量
。
const修饰变量
const与普通变量
const
修饰普通变量(即定义 常变量/常量),必须在声明(定义)的同时进行初始化,因为通过const定义的普通常变量,在定义之后不能(无法)修改其值。
格式:
(1)const
数据类型 变量名 = value;
(2)数据类型const
变量名 = 值;
以上两种格式在功能(效果 / 作用)上没有区别,但通常使用格式(1)。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>
int main()
{
// 以下是正确的
const int a = 10;
const char ch = 'a';
std::string const ss("夏尔·凡多姆海威");
// 以下是错误的,因为没有初始化
const int b;
const float f;
return 0;
}
const与指针变量
格式:
(1)const 数据类型 *变量名;
(2)数据类型 const *变量名;
(3)数据类型 * const 变量名 = 地址;
(4)const 数据类型 * const 变量名 = 地址;
(5)数据类型 const * const 变量名 = 地址;
说明:
- 格式(1)同格式(2),通常使用格式(1)。
- 格式(4)同格式(5),通常使用格式(4)。
- 也就是说,实际编程中,会使用的格式有:(1)、(3)、(4)。
格式(1),示例:
1
2
3
4
5
6
7
8
9
char ch1 = 'a';
char ch2 = 's';
const char* p1; // *p1为常量,指针p1为变量;p1可以不初始化
p1 = &ch1; // 操作正确:p1为变量,可以修改p1的值,使指针变量指向别的地址
*p1 = 'r'; // 操作错误:*p1为常量,不能通过指针修改所指向的内存空间中的值(保存的数据)
const char* p2 = &ch2;
*p2 = 'c'; // error,同 *p1 = 'r';
格式(3),示例:
1
2
3
4
5
6
7
8
9
10
int n = 7;
int m = -1;
int* const p1 = &n; // 正确,指针p1为常量;必须在定义指针p1的同时进行初始化
*p1 = 6; // 正确,*p1为变量,n也是变量,可以通过*p1修改整型变量n的值
p1 = &m; // 错误,指针p1为常量,不能修改其指向的地址
int* const p2; // 错误,未初始化
格式(4),示例:
1
2
3
4
5
6
7
8
9
float pi = 3.14;
float f = 2.5;
const float* const p1 = π // 正确,指针p1为常量,必须在定义的同时进行初始化
*p1 = 0.618; // 错误,*p1为常量,不可修改(不能通过指针修改所指向的内存空间的数据)
p1 = &f; // 错误,指针p1为常量,不可修改(不能修改其指向的地址)
const float* const p2; // 错误,未初始化
const与#define
- const定义的常量有类型,#define定义的常量(宏定义)没有类型,编译可以对const常量进行类型安全检查,而#define常量仅仅是做简单替换。
- const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。
- 作用域不同,const定义的常变量的作用域和该变量的作用范围相同。#define定义的常量其作用域为定义点到 #undef取消为止 或 文件结束。
- 定义常量还可以使用enum,尽量使用const、enum代替#define来定义常量。
- #define定义的常量,容易产生副作用。
高层次编程,尽可能使用const、enum、inline代替#define。
底层编程,#define是很灵活的。
const与成员函数
const放到类的成员函数的参数列表(小括号)之后,函数体之前,那么此函数不能修改类成员变量。
如果想在const成员函数
内修改成员变量,需用mutable
关键字修饰要修改的成员变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Entity
{
private:
int x;
mutable int y; // mutable 关键字
public:
int get_X() const // const成员函数
{
// x = 10; // 出现错误,不可修改
y = 5; // 可以修改
return x;
}
void set_X(int x)
{
this->x = x;
}
};
本文由作者按照 CC BY 4.0 进行授权