外观
02.const、布尔类型、引用
约 1756 字大约 6 分钟
布尔类型C++编程语言引用
2022-06-15
三、进化后的const分析
1、C语言中的const
- const修饰的变量是只读的,本质还是变量
- const修饰的局部变量在栈上分配空间
- const修饰的全局变量在只读存储区分配空间
- const只在编译期有用,在运行期无用
- const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。
- C语言中的const使得变量具有只读属性
- const将具有全局生命周期的变量存储于只读存储区
- const 不能定义真正意义上的常量!
编程实验:C++中的const


2、C++ 中的const
- C++ 在C的基础上对 const 进行了进化处理
- 当碰见const声明时在符号表中放入常量
- 编译过程中若发现使用常量则直接以符号表中的值替换
- 编译过程中若发现下述情况则给对应的常量分配存储空间
- 对const常量使用了extern
- 对const常量使用&操作符
注意:(为了兼容C语言)C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

C语言中的const变量
- C语言中const变量是只读变量,会分配存储空间
C++ 中的const常量
- 可能分配存储空间
- 当const常量为全局,并且需要在其它文件中使用
- 当使用&操作符对const常量取地址
- 可能分配存储空间
C++中的const常量类似于宏定义
- const int c = 5; ≈ #define c 5
C++中的const常量在与宏定义不同
- const常量是由编译器处理
- 编译器对const常量进行类型检查和作用域检查
- 宏定义由预处理器处理,单纯的文本替换
编程实验:const 与 宏


- C 编译器下报错,对于编译器而言,变量A和B在编译阶段并不知道具体的数值,而是等到运行时才知道。
- C++编译器下,A和B是常量,直接从符号表中获取即可。
3、小结
- 与C语言不同,C++中的const不是只读变量
- C++中的const是一个真正意义上的常量
- C++编译器可能会为const常量分配空间
- C++完全兼容C语言中const常量的语法特性
四、布尔类型
1、C++中的布尔类型
C++在C语言的基本类型系统之上增加了 bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节
注意:
- true代表真值,编译器内部用1来表示
- false代表非真值,编译器内部用0来表示
bool类型只有true(非0)和false (0)两个值
C++编译器会将非0值转换为true,0值转换为false
下面的代码输出什么?

- 编程实验:布尔类型的使用


- 布尔类型是C++中的基本数据类型
- 可以定义bool类型的全局变量
- 可以定义bool类型的常量
- 可以定义bool类型的指针
- 可以定义bool类型的数组
- …..
2、三目运算符
C++对三目运算符进行了升级
下面的代码正确吗?

C语言中的三目运算符返回的是变量值
- 不能作为左值使用
C++中的三目运算符可直接返回变量本身
- 既可作为右值使用,又可作为左值使用
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用。
C++对三目运算符做了怎样的升级?这种升级的意义是什么?
3、C++中的引用
变量名回顾
- 变量是一段实际连续存储空间的别名
- 程序中通过变量来申请并命名存储空间
- 通过变量的名字可以使用存储空间

问题:一段连续的存储空间只能有一个别名吗?
在C++中新增加了引用的概念
- 引用可以看作一个已定义变量的别名
- 引用的语法:Type& name = var;

注意:普通引用在定义时必须用同类型的变量进行初始化。
实例分析:引用初体验


C++对三目运算符做了什么?
- 当三目运算符的可能返回都是变量时,返回的是变量引用
- 当三目运算符的可能返回中有常量时,返回的是值

4、小结
- bool类型是C++新增加的基础类型
- bool类型的值只能是true和false
- C++中的三目运算符可作为左值使用
- C++中的引用可以看作变量的别名来使用
- 三目运算符的可能返回都是变量时,返回的是引用
五、引用的本质分析
1、引用的意义
- 引用作为变量别名而存在,因此在一些场合可以代替指针
- 引用相对于指针来说具有更好的可读性和实用性

- 注意:函数中的引用形参不需要进行初始化!!!
2、特殊的引用


3、思考:引用有自己的存储空间吗?

- 编程实验:引用的思考


4、引用的本质
- 引用在C++中的内部实现是一个指针常量

- 注意:
- C++编译器在编译过程中用指针常量作为引用的内部实现,因此引用所占用的空间大小与指针相同。
- 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节。
5、编程实验:引用的存储空间



6、引用的意义
- C++中的引用旨在大多数的情况下代替指针
- 功能性:可以满足多数需要使用指针的场合
- 安全性:可以避开由于指针操作不当而带来的内存错误
- 操作性:简单易用,又不失功能强大
7、小结
- 引用作为变量别名而存在旨在代替指针
- const引用可以使得变量具有只读属性
- 引用在编译器内部使用指针常量实现
- 引用的最终本质为为指针
- 引用可以尽可能的避开内存错误
