chapter5 数据共享与保护
标识符的作用域与可见性
作用域即标识符的有效范围,可见性即标识符是否可以被引用
作用域
- 函数原型作用域
- 局部作用域
- 类作用域
- 文件作用域
- 命名空间作用域
可见性
标识符可见性规则:
- 声明在前,使用在后
- 同一作用域中,不能声明同名的标识符
- 在没有互相包含关系的不同作用域中声明的同名标识符互不影响
- 在两个或多个具有包含关系的作用域中声明同名标识符,则外层标识符在内层不可见
对象生存期
静态生存期:与程序运行期相同,称其具有静态生存器,如使用static声明的局部变量、全局变量
动态生存期:除以上两种情况外的对象
静态成员
静态成员为类的所有对象所有,只有一份供整个类使用(数据共享)
静态数据成员
- 使用static关键字在类内声明
static type_name variable_name
,类外定义type_name class_name::variable_name=n
- 静态数据成员具有静态生命周期
- 使用方式
class_name::variable_name
obj_name.variable_name
静态成员函数
- 使用static关键字声明
static type_name func_name(parameters)
- 使用方式
class_name::func_name()
obj_name.func_name()
- 静态成员函数可以直接访问该类的静态数据和函数成员
- 静态成员函数访问非静态数据成员必须通过对象名
类的友元
友元提供了不同类或对象成员函数之间、类的成员函数与一般函数之间的共享机制
友元函数
- 使用friend声明
friend type_name func_name(parameters)
- 通过声明的友元函数可以直接在类外访问类的私有和保护成员
友元类
- 使用friend声明
friend class class_name
- A为B的友元类,则A的所有成员函数都是B的友元函数,都可以访问B类的私有和保护成员
注意:
- 友元关系单向
- 友元关系非传递
- 友元关系不可继承
共享数据的保护
常对象
常对象必须被初始化且不能被更新const class_name obj_name
- 常对象不能通过对象名访问对象成员,不能为其属性赋值
- 不能通过常对象调用普通成员函数
常成员函数
type_name func_name(parameters)const;
- 常成员只能调用常成员函数
- 常成员函数调用期间,目的对象都视为常对象,常成员函数不能更新目的对象的数据成员,也不能调用其他非常成员函数
- 可以用于重载
常数据成员
常数据成员不能在任何函数中赋值
构造函数只能通过列表初始化
常引用
const typename &variable_name;
- 常引用所引用的对象不能被更新
- 非常引用不能绑定常对象
多文件编程与编译预处理指令
略