首页 > 代码库 > 第5章 数据的共享与保护
第5章 数据的共享与保护
主要介绍标识符的作用域、可见性和生存周期的概念,以及类成员的共享与保护问题。
5.1 标识符的作用域与可见性
5.1.1 作用域
作用域是一个标识符在程序正文中有效的区域。
1.函数原型作用域:
在函数原型声明时形参的作用范围就是函数原型作用域,可以省略形参标识符。但考虑程序的可读性,通常还是要在函数原型声明时给出形参标识符。
2.局部作用域:
函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数体结束之处为止。函数体内声明的变量,其作用域从声明处开始,一直到声明所在的块结束的 大括号为止。具有局部作用域的变量也称为局部变量。
3.类作用域
(1) 如果在类的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以直接访问成员m
(2) 程序中访问对象成员的基本方法:对象名、引用名、静态成员访问、指针。
4.命名空间作用域
(1) 定义:namespace 命名空间名{命名空间的各种声明...}
(2) 使用:命名空间名::标识符名(指定命名空间内的指定标识符暴露) / using namesapce 命名空间名(指定命名空间内的所有标识符暴露在当前的作用域)
(3) 全局命名空间:默认的命名空间,在显示的声明的命名空间之外声明的标识符都在一个全局命名空间中。
(4) 匿名命名空间:不指定命名空间的名字,常用来屏蔽不希望暴露给其他源文件的标识符
(5) 具有命名空间作用域的变量也成为全局变量
5.1.2 可见性
程序运行到某一点,能够引用到的标识符,就是该处可见的标识符
作用域可见性的一半规则:
(1) 标识符的声明在前,引用在后
(2) 同一作用域中,不能声明同名的标识符
(3) 没有相互包含关系的不同作用域中的同名标识符,互不影响
(4) 如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见
5.2 对象的生存期
对象从诞生到结束的这段时间,就是它的生存期。对象的生存期分为动态生存期和静态生存期两种
5.2.1 静态生存期
1. 概念:如果对象的生存期与程序的运行期相同,则称它具有静态生存期
2. 特点:不会随每次函数调用而产生副本,也不会随函数返回而消失
5.2.2 动态生存期
在局部作用域中声明的具有动态生存期的对象,习惯上也称为局部生存期对象,诞生与声明点,结束于声明所在块执行完毕之时。
5.3 类的静态成员
5.3.1 静态数据成员
1. 类属性是描述类的所有对象共同特征的一个数据项,对任何对象的实例,它的属性值是相同的
2. 静态数据成员具有静态生存期,可以通过类型来访问: 类名::标识符
3. 一半定义为私有成员
5.3.2 静态成员函数
静态成员函数可以直接访问该类对象的静态数据和成员函数,而访问非静态成员必须通过对象名
5.4 类的友元
友元函数提供了不同类或对象成员函数之间,类的成员函数与一般函数之间进行数据共享的机制
5.4.1 友元函数
友元函数是在类中用关键字friend修饰的非成员函数,在它的函数体中可以通过对象名访问类的私有和保护成员
5.4.2 友元类
若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以B的私有类和保护成员
5.4.3 注意:
1. 友元关系不能传递
2. 友元关系是单向的
3. 友元关系不能被继承
5.5 共享数据的保护
5.5.1 常对象:必须被初始化,而且不能被更新。只能调用常成员函数。
5.5.3 用const修饰的类成员
1. 常成员函数:
类型说明符 函数名(参数列表) const;
常成员函数不能调用非常成员函数,非常成员函数可以调用常成员函数
2. 常数据成员:
在析构函数中使用初始化列表进行初始化,而不能使用参数传递的方式进行初始传递,因为其是常量
3. 常引用:常引用所引用的对象不能被更新,类比:const int *p, int * const p
const 类型说明符 &引用名
5.6 多文件结构和编译预处理命令
5.6.1 C++程序的一般组织结构:
1. 类定义文件.h
2. 类实现文件.cpp
3. 类使用文件.cpp
5.6.2 外部变量和外部函数
1. 外部变量:extern关键字修饰
2. 外部函数:使用extern关键字修饰、可以省略
3. 将变量和函数限制在编译单元内:使用namespace关键字
5.6.3 标准C++库
逻辑上分为6类:输入输出类-> 容器类与ADT -> 存储管理类 -> 算法 -> 错误处理 -> 运行环境支持
5.6.4 编译预处理
所有预处理指令都是以“#”来引导,每一条预处理指令单独占用一行,不要用分号结束,可以出现在任何位置
1. #include指令:文件包含指令,作用是将另一个源文件嵌入到当前源文件中的该点处,通常用来嵌入头文件
(1) #include <> :按标准方式搜索,文件位于系统目录的include子目录下
(2) #include "":首先在当前目录中搜索,若没有,再按照标准方式搜索
2. #define:定义宏
#undef:删除宏
3. 条件编译指令
#if ... #elif ... #elif ... #else ...#endif
4. #defined操作符:不要以#开头 defined (标识符):如果未定义则返回0,否则返回非0
第5章 数据的共享与保护