文章目录
5.1 标识符的作用域与可见性
作用域讨论的是标识符的有效范围,可见性讨论的是标识符是否可以被引用
5.1.1 作用域
作用域是一个标识符在程序正文中有效的区域,分为:函数作用域、局部作用域(块作用域)、类作用域、命名空间作用域
函数原型作用域
在函数原型声明时形式参数的作用范围就是函数原型作用域
局部作用域
具有局部作用域的变量称为局部变量
命名空间作用域
命名空间的语法形式如下:
namespace 命名空间名 {
命名空间内的各种声明(函数声明、类声明、...)
}
在命名空间内部可以直接引用当前命名空间中声明的标识符,如果需要引用其他命名空间的标识符,需要使用以下语法:
命名空间::标识符名
有时,为了解决命名空间冗长的问题,可以使用以下两种using语句:
using 命名空间名::标识符名;
using namespace 命名空间名;
补充:using的三种用法
- 导入命名空间
- 指定别名
- 在派生类中引用基类成员
还有两类特殊命名空间:全局命名空间和匿名命名空间。全局命名空间是默认的命名空间,在显示声明的命名空间之外声明的标识符都在一个全局命名空间中。匿名命名空间是一个需要显示声明的没有名字的命名空间,声明方式如下:
namespace {
匿名命名空间内的各种声明(函数声明、类声明、…)
}
具有命名空间作用域的变量称为全局变量。
5.1.2 可见性
程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。有以下一般规则:
- 标识符要声明在前,引用在后
- 同一作用域,不能声明同名的标识符
- 在没有互相包含关系的不同作用域中声明的同名标识符,互不影响
- 如果在两个或多个具有包含关系的作用域中声明了同名标识符,责外层标识符在内层不可见
5.2 对象生存期
对象从诞生到结束的这段时间叫做他的生存期。生存期内,对象将保持它的状态(即数据成员的值),变量也将保持它的值不变,直到被更新为止。
5.2.1 静态生存期
如果对象的生存期与程序的运行期相同,则称它具有静态生存期
以下两种情况对象具有静态生存期:
- 在命名空间作用域中声明的对象
- 在函数内部的局部作用域声明,且使用关键字static
定义时未指定初值的基本类型静态生存期变量,会被赋予0值初始化,而对于动态生存期变量,不指定初值意味着初值不确定
5.2.2 动态生存期
除了静态生存期对象,其余都是动态生存期对象。
5.3 类的静态成员
5.3.1 静态数据成员
区分面向对象方法中实例属性和类属性
如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字声明为静态成员。静态成员在每个类只有一个副本,由该类的所有对象共同维护和使用,从而实现同一个类的不同对象之间的数据共享。类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。
静态数据成员具有静态生存期。由于静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问,一般用法是“类名::标识符”。在类的定义中仅对静态数据成员进行引用性声明,必须在命名空间作用域的某个地方使用类名限定定义性声明,这时也可以初始化
5.3.2 静态函数成员
作用及定义类似静态数据成员。
静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态成员,必须通过对象名
5.4 类的友元
5.4.1 友元函数
5.4.2 友元类
5.5 共享数据的保护
5.5.1 常对象
常对象:数据成员值在对象整个生存期间内不能被改变的对象。常对象必须被初始化,而且不能被更新。
注意:在定义一个变量或常量时为它指定初值叫做初始化,而在定义一个变量或常量以后使用赋值运算符修改它的值叫做赋值
5.5.2 用const修饰的类成员
- 常成员函数
- 常数据成员
构造函数对常数据成员进行初始化,只能通过初始化列表方式 - 常引用