字面值、常量和关键字const

C++中的三个比较重要,也是比较容易混淆的基础概念:字面字、常量和const

关键字const

const 是一个比较常见,也是比较重要的关键字。最简单的解释:const修饰的变量,其“值”、也就是内容,不可修改,一经初始化即不可修改。

const与指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int a = 10;
const int x = 10;
const int *pre_1 = &x; //正确,指针pre_1和x的类型都是const int
const int pre_2 = a; //正确,可以用一个int类型的对象a,给常量常量pre_2初始化


//指向常量的指针:定义方式为 const 类型* 指针名。这种指针指向的对象的值不能被通过该指针修改,但指针本身可以指向不同的对象
int a = 10;
int b = 20;
const int *ptr = &a; // ptr 是指向常量的指针
*ptr = 15; // 错误,不能通过 ptr 修改 a 的值
ptr = &b; // 合法,ptr 可以指向另一个对象


//指针常量:定义方式为 类型* const 指针名。这种指针本身是常量,指针的指向不能被改变,但指向对象的值可以通过指针修改
int a = 10;
int* const ptr = &a; // ptr 是指针常量
*ptr = 15; // 合法,可以修改 a 的值
ptr = &b; // 错误,ptr 不能指向另一个对象


//指向常量的指针常量:既不能通过指针修改对象的值,也不能改变指针的指向。定义方式为 const 类型* const 指针名
int a = 10;
const int* const ptr = &a; // ptr 是指向常量的指针常量
*ptr = 15; // 错误,不能通过 ptr 修改 a 的值
ptr = &b; // 错误,ptr 不能指向另一个对象

const的引用

和其他引用一样,const的引用也是一个“绑定”

1
2
3
4
5
const double pi=3.14;    //定义了一个 const 类型的双精度浮点数,pi 不能被修改
double PI=3.14; //定义了一个非 const 类型的双精度浮点数,PI 可以被修改
const double &a = pi; //正确,&a 是对 const double pi 的引用,类型一致;a 是一个对 pi 的 const double 引用,引用类型和 pi 类型一致。
a = 888.888; //错误,a是const修饰的引用(对常量的引用),不能通过a改变pi的值
const double &b = PI; //正确,允许将const类型引用绑定在一个非 常量的对象身上

字面值

字面值:直接出现在代码中的值

例如:

  • 整数字面值:例如 42, 0, -7

  • 浮点数字面值:例如 3.14, -0.001

  • 字符字面值:例如 ‘a’, ‘B’, ‘\n’

  • 字符串字面值:例如 “Hello”, “World”

  • 布尔字面值:例如 true, false

字符字面值、字符串字面值和string对象

字符字面值:关键字char ,用单引号括起来的,只能是单个字符,底层通常表现为对应的ASCII码值或Unicode值

字符串字面值:用双引号括起来的,不可修改,可以是零个或一个或多个字符构成,在底层表现为一个字符数组,以空字符”\0”标志结束

string对象:可以进行动态管理,标准库中的类,以空字符”\0”标志结束

常量

常量的定义:不可改变的量

从字面上理解即可,出现后就不能改变的量。又分为两种:

  • 字面值
  • const修饰的变量