第五章 数据的共享与保护
函数原型作用域: 在函数原型声明时形式参数的作用范围就是函数原型作用域
局部作用域: 函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数结束之处为止。
函数体内声明的变量,其作用域从声明处开始,一直到声明所在的块结束的大括号为止。
具有局部作用域的变量也称为局部变量。
类作用域: 类可以被看作是一组有名成员的集合,类X的成员m具有类作用域。
命名空间作用域: 消除同名歧义,一个命名空间确定了一个命名空间作用域
全局命名空间是默认的命名空间,在显式声明的命名空间之外声明的标识符都在一个全局命名空间中。
匿名命名空间是一个需要显式声明的没有名字的命名空间。
具有命名空间作用域的变量也称为全局变量。
静态生存期: 如果对象的生存期与程序的运行期相同,则称它具有静态生存期。
在命名空间作用域中声明的对象都是具有静态生存期的。
关键字static可以在函数内部的局部作用域中声明具有静态生存期的对象。
静态变量,不会随着每次函数调用而产生一个副本,也不会随着函数返回而失效,该变量会在每次调用间共享。
未指定初值的基本类型静态生存期变量,会被赋予0值初始化。
动态生存期:
作用: 静态成员是解决同一个类的不同对象之间数据和函数共享问题的。
**注:**在类的定义中仅仅对静态数据成员进行引用性声明,必须在命名空间作用域的摸个地方使用类名限定定义性声明,这时也可以进行初始化。
静态数据成员函数可以直接访问该类的静态数据和函数成员。
而访问非静态成员,必须通过对象名。
友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
如果A类是B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
注意:
友元关系是不能传递的;
友元关系是单向的;
友元关系是不被继承的。
它的数据成员值在对象的整个生存期内不能被改变。(常对象必须进行初始化,而且不能被更新)
const 类型说明符 对象名;
不能通过常对象调用普通的成员函数。
声明格式:
类型说明符 函数名(参数表) const;
在函数的声明和定义时都要带const关键字;
常对象只能调用它的常成员函数;
常成员函数不能更新目的对象的数据成员;
const可以用于对重载函数的区分。
如果在一个类中说明了常数据成员,那么任何函数中都不能对该成员赋值。
构造函数中对它赋值只能通过初始化列表。
常引用所引用的对象不能被更新。
const 类型说明符 &引用名
非const的引用只能绑定到普通的对象,而不能绑定到常对象
如果一个变量除了在定义它的源文件中可以使用外,还能被其他文件使用,那么就称它为外部变量。
命名空间作用域中定义的变量,默认情况下都是外部变量,但是在其他文件中如果需要使用这一变量,需要使用extern关键字 加以声明。
在所有类之外声明的函数,具有命名空间作用域,若没有特殊说明,这样的函数都可以在不同的编译单元中被调用,只要在调用之前进行引用性声明(即声明函数原型)即可。
static关键字用来修饰命名空间作用域的变量或函数时,和extern关键字起相反的作用,他会使得被static修饰的变量和函数无法被其他编译单元引用。
注: static关键字在用在局部作用域、类作用域、命名空间作用域时具有不尽相同的作用。