造“地基”的C++ (五)数据的共享和保护

数据的共享和保护

 

标识符的作用域与可见性

  • 作用域分类
  1. 函数原型作用域:函数原型中的参数,其作用域始于“(”,结束于“)”。
  2. 局部作用域(块作用域):函数的大括号中
  3. 类作用域:范围包括类体以及类体外定义成员函数的函数体
  4. 文件作用域:不在前述各个作用域中出现的声明,就具有文件作用域。   其作用域开始于声明点,结束于文件尾。
  5. 命名空间作用域
  • 可见性
  1. 如果某个标识符在外层中声明,且在内层中没有统一标识符的声明,则该标识符在内层可见
  2. 对于两个嵌套的作用域,如果在内层作用域中声明了与外层作用域同名的标识符,则外层作用域的标识符在内层不可见

 

对象的生存期

  1. 静态生存期

它的生存期和程序的整个运行是一致的,比如说具有文件作用域的标识符、变量名、对象名,它都具有静态生存期,只有当整个程序运行结束的时候,它才消失。在函数内部声明静态生存期对象,要加关键字static

  1. 动态生存期

开始于声明它的那个点,结束于仅仅包含它的作用域结束。

 

类的静态数据成员

  1. 用关键字static声明
  2. 为该类的所有对象共享,但不属于每个对象,静态数据成员具有静态生存期
  3. 必须在类外定义和初始化,用(::)来指明所属的类   如:int Point::count = 0;

 

静态函数成员

静态函数成员主要用于处理该类的静态数据,不用来处理属于对象的数据

静态函数成员如果访问非静态成员,要通过对象来访问

可以通过类名.函数方式调用,也可以通过对象.函数的方式调用

 

类的友元

  • 表述:
  1. 有元(关键字friend):对一些类外的函数、其他的类给预授权,使之可以访问类的私有成员
  2. 友元是C++提供的一种破坏数据封装和数据隐藏的机制
  3. 为了保证数据的完整性,建议慎用
  • 友元函数
  1. 友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员
  2. 作用:增加灵活性
  3. 访问对象中的成员必须通过对象名
  4. 声明:在类内public接口处,申明友元函数   例:friend float dist(Point &a, Point &b)
  • 友元类
  1. 若一个类为另一个类的友元,则此类的所有成员都能访问对方的私有成员
  2. 声明语法:将友元类名在另一个类中使用friend 修饰说明
  3. 类的友元关系是单向的,声明B类是A类的友元 != A类是B类的友元

 

共享数据的保护

  • 常类型
  1. 常对象:必须进行初始化,不能被更新     const  类名  对象名;
  2. 常成员:用const进行修饰的类成员:常数据成员和常函数成员

常成员函数:常成员函数不更新对象的数据成员

说明格式: 类型说明符 函数名(参数表) const;

Const关键字可以用于参与对重载函数的区分

通常常对象只能调用他的常成员函数

  1. 常引用:被引用的对象不能被更新    const 类型说明符 &引用名
  2. 常数组
  3. 常指针

 

多文件结构

  • C++程序的一般组织结构
  1. 一个工程可以划分为多个源文件

类声明文件(.h文件)

类实现文件(.cpp文件)

类的使用文件(main()所在的.cpp文件)

  1. 利用工程来组合各个文件
  • 外部变量
  1. 除了在定义它的源文件中可以使用外,还能被其他文件使用
  2. 文件作用域中定义的变量,默认情况下都是外部变量
  3. 在其他文件中如果需要使用,需要用extern 关键字声明
  • 外部函数
  1. 在所有类之外声明的函数(也就是非成员函数),都是具有文件作用域的
  2. 这样的函数都可以在不同的编译单元中被调用
  3. 只需要在调用之前申明函数原型即可
  • 将变量和函数限制在编译单元内

     在匿名命名空间中定义的变量和函数,都不会暴露给其他编译单元

namespace{//匿名的命名空间

Int n;

}

  • 标准C++库

标准C++类库是一个极为灵活并可扩展的可重用软件模块集合,标准C++类与组件在逻辑上分为6种类型:

  1. 输入输出类
  2. 容器类与抽象数据类
  3. 储存管理类
  4. 算法
  5. 错误处理
  6. 运行环境支持

 

编译预处理命令

  • 编译预处理
  1. #include包含指令

将一个源文件嵌入到当前源文件中该点处

#include<文件名>       #include“文件名”

  1. #define
  2. Undef:删除#define定义的宏

 

 

 

猜你喜欢

转载自blog.csdn.net/ndliuning/article/details/81225674
今日推荐