第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

时间: 2024-08-13 15:29:57

第5章 数据的共享与保护的相关文章

我的C++笔记(数据的共享与保护)

*数据的共享与保护: * 1.作用域: * 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用域(块作用域).类作用域和命名空间作用域. * (1).函数原型作用域: * 函数原型作用域是C++中最小的作用域,在函数原型中一定要包含形参的类型说明.在函数原型声明时形式参数的作用范围就是函数原型的作用域.如:double area(double radius);标识符radius的作用范围就在函数area形参列表的括号之间. * 由于在函数原型的形参列表中起

2.数据的共享与保护

1.作用域 - 函数原型作用域:形参范围 - 局部作用域 - 类作用域 x.m.x->m.x::m - 命名空间作用域:namespace name{}.name::person p.using namespace name;具有命名空间作用域的变量也叫全局变量 2.可见性规则: - 标识符要声明在前,引用在后 - 在同一作用域中,不能声明同名标识符 - 在没有互相包含关系的不同作用域声明同名标识符互不影响 - 若在包含关系的作用域中声明同名标识符,则外层在内层不可见 3.对象生存期 - 静态生

Part5 数据的共享与保护 5.3类的静态成员

静态数据成员: 1 用关键字static声明 2 为该类的所有对象共享,静态数据成员具有静态生存期. 3 必须在类外定义和初始化,用(::)来指明所属的类. //5-4具有静态数据成员的Point类 #include<iostream> using namespace std; class Point{ public: Point(int x = 0, int y = 0):x(x), y(y){ count++;//在构造函数中对count累加,所有对象维护共同一个count } Point

数据的共享与保护

QQ:1783478816根据我多年总结出来的经验,玩好一个彩种只需要学会以下四重奏:心得 分配 技巧 运用 第一:心态问题,如果你是容易上脑请看第二点例子,如果你不懂合理分配请看下面例子.心态请看好下面例子几点: 1.沉迷久du,必输(塞车每天179期,每一期走势都在改变,也许这会这个走势刚好带你赢了点钱,但不代表能够一直赢下去,也许下一秒走势就变了,盈利瞬间化为乌有) 2.心态爆炸,容易上头,必输(心态把控不好,赢了贪得无厌想要接着赢下去,输了不甘服输一定要博个翻本,殊不知越陷越深,直至万丈

《Java并发编程实战》第三章 对象的共享 读书笔记

一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见性的描写叙述即多线程能够实时获取其它线程改动后的状态. *** 待补充   两个工人同一时候记录生产产品总数问题 1. 失效数据 可见性出现故障就是其它线程没有获取到改动后的状态,更直观的描写叙述就是其它线程获取到的数据是失效数据. 2. 非原子64位操作 3. 加锁与可见性 比如在一个变量的读取与

深入浅出Zabbix 3.0 -- 第九章 数据可视化

第九章 数据可视化 Zabbix是一个非常灵活.强大的监控系统,它不仅能够监控大量不同类型的数据指标,并为这些数据及数据之间的关联提供了多种可视化工具,通过图形.展示屏.网络拓扑图等将数据直观的展现出来,实时的浏览和查看监控设备的状态. 9.1 图形 Zabbix 3.0中支持三种graphs(图形),即simple graphs(简单图形).ad-hocgraphs(自组图形)和customgraphs(自定义图形). 9.1.1 简单图形 简单图形是Zabbix系统内置的一种方法,为监控项数

Java 线程第三版 第三章数据同步 读书笔记

多线程间共享数据问题 一.Synchronized关键字 atomic一词与"原子"无关,它曾经被认为是物质的最小的单元,不能再被拆解成更小的部分. 当一个方法被声明成synchronized,要执行此方法的thread必须先取得一个token,我们将它称为锁.一旦该方法取得(或者说是获得)锁,它将运行此方法然后释放掉(或者返回)此锁.不管方法时怎样返回的(包括通过异常)该锁会被释放. 二.Volatile关键字 如果变量被标示为volatile,每次使用该变量时都必须从主寄存器中读出

系统分析员考试复习笔记-4:第四章 数据通讯与计算机网络

 1.      第四章数据通讯与计算机网络(P143) 计算机网络源于计算机技术与数据通讯技术的结合,它通过网络链路将分布在各个地理位置的多台独立的计算机相互连接起来,从而形成一种网络,并在网络操作系统.网络管理软件和网络通讯协议的管理和协调下,实现资源(硬件.软件和数据)共享. 1.1.      数据通讯基础知识 1.1.1.     信道特性 各种数据终端设备交换数据,必然要传输数据(模拟信号或者数字信号),数据传输的路径称为信道.信道可以分为物理信道和逻辑信道.物理信道由传输介质和

语法》第九章 数据类型转换

第二部分  语法 ************第九章 数据类型转换 *************** JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值. 虽然变量没有类型,但是数据本身和各种运算符对运算子是有类型要求的.如果运算符发现,数据的类型与预期不符,就会自动转换类型.比如,减法运算符预期两侧的运算子应该是数值,如果不是,就会自动将它们转为数值. JS有一套数据类型自动转换的规则 一.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数