第五章数据的共享与保护
作用域与可见性
对象的生存期
静态成员
友元
共享数据的保护
多文件结构和工程
编译预处理命令
作用域
作用域
函数原型作用域
函数原型作用域开始于函数原型声明的左括号“(”,结束于右括号“)”。例如:double Area(double length, double width);
函数原型作用域是C++程序中最小的作用域。
由于形参length和width只在括号之内有效,在程序的其它地方无法引用这个标识符,如果要引用,必须重新定义。因此,这里的标识符length和width实际上是可有可无的,省去它,也决不会影响到程序的编译和运行结果。例如:double Area(double, double);
块作用域
又称局部作用域。由一对花括号“{ }”所括起来的块中声明的标识符的作用域从声明处开始,一直到块结束的花括号为止。例如:
void main( )
{
void fun1( ) ;
int n;
for( int i=0 ; i<5; i++ )
{
int m ;
if( i%2 ) n++ ;
}
m = n/2 ; //错误,m未定义
n = i ;
fun1( ) ; //fun1( )函数调用
}
void fun1( )
{
cout<<"i="<<i<<endl ; //错误,i未定义
}
块作用域不能延伸到子函数中
作用域
作用域
类作用域
在分析类作用域时,把类看成是一组有名成员的集合,除个别例外(如:友元),类的作用域作用于特定的成员名。
类X的成员m在下列情况下具有类作用域
在类X的成员函数内出现的标识符m;同时在该成员函数中没有声明同名的局部作用域标识符。
::m的表达式中,m具有类作用域,这正是在程序中访问对象成员的基本方法。
通过ptr->m表达式,其中ptr为指向X类的对象的指针。
文件作用域
#include<>
int k; //全局变量,具有文件作用域
void main()
{
k=5;
{k++; }
{ int k=7; k++; cout<<"k="<<k; }
cout<<“, k="<<k<<endl;
}
命名空间作用域(同文件作用域)
具有命名空间作用域的变量即全局变量
程序运行结果为:k=8, k=6
作用域
作用域
#include <iostream>
using namespace std;
int i; //全局变量
Namespace Ns{
int j;}
int main( )
{
i=5;
Ns::j=6;
{
using namespace Ns;
int i;
i=7;
cout <<“i=”<<i<<endl;
cout <<“j=”<<j<<endl;
}
cout <<“i=”<<i<<endl;
return 0;
}
可见性
程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。
可见性遵循的一般规则:
标识符在引用前必须先声明。
在互相没有包含关系的不同作用域中声明同名的标识符时,两标识符互不影响。
如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。
对象(变量)的生存期
对象或变量从产生到结束的这段时间称为它的生存期;
生存期分类:静态生存期和动态生存期
静态生存期
如果对象的生存期与程序的运行期相同,称其具有静态生存期;
具有文件作用域的变量(全局变量)具有静态生存期。
如果要在函数内部的块作用域中使用关键字static修饰的对象,即静态对象,具有静态生存期。例如: static int k;
动态生存期
除了上述两种情况,其余的对象都具有动态生存期。
块作用域中声明的具有动态生存期的对象,习惯称为局部对象;
动态生存期对象(变量)开始于声明点,结束于标识符作用域结束处。
对象的生存期
对象生存期
举例:
#include <>
class Clock
{
public:
Clock();
Clock(Clock &c);
void SetTime(int newH, int newM, int newS);
void ShowTime();
~Clock();
private:
int Hour,Minute,Second;
};
Clock::Clock()
{ Hour=0;Minute=0;Second=0; cout<<“构造函数被调用”<<endl; }
对象生存期
Clock::Clock(Clock &c)
{ Hour=; Minute=
第5章 数据共享 来自淘豆网m.daumloan.com转载请标明出处.