第4章作用域及成员指针 4.1 作用域 4.2名字空间 4.3成员指针 4.4 const、volatile和mutable 4.5 引用对象
第4章 作用域及成员指针 4.1 作用域 4.2 名字空间 4.3 成员指针 4.4 const、volatile和mutable 4.5 引用对象
作用域 作用域: 标识符起作用的范围。作用域运算符:既 是单目运算符,又是双目运算符。优先级和结合 性同括号 ▣单目:用于限定全局标识符(类型名、变量名以及常量 名等) ·双目:用于限定类的枚举元素、数据成员、函数成员以 及类型成员等。双目运算符:还用于限定名字空间成 员,以及恢复自基类继承的成员的访问权限。 在类体外定义数据和函数成员时,必须用双目:限 定类的数据和函数成员,以便区分不同类之间的 同名成员
4.1 作用域 作用域:标识符起作用的范围。作用域运算符:: 既 是单目运算符,又是双目运算符。优先级和结合 性同括号。 单目::用于限定全局标识符 (类型名、变量名以及常量 名等 ) 双目::用于限定类的枚举元素、数据成员、函数成员以 及类型成员等。双目运算符::还用于限定名字空间成 员,以及恢复自基类继承的成员的访问权限。 在类体外定义数据和函数成员时,必须用双目:: 限 定类的数据和函数成员,以便区分不同类之间的 同名成员
作用域 作用域分为面向过程的作用域(C传统的作用域)和 面向对象的作用域。 面向过程的:词法单位的作用范围从小到大可以分为四 级:①作用于表达式内,②作用于函数内,③作用于程 序文件内,④作用于整个程序。 面向对象的:词法单位的作用范围从小到大可以分为五 级:①作用于表达式内,②作用于函数成员内,③作用 于类或派生类内,④作用于基类内,⑤作用于虚基类 内。 ■ 标识符的作用域越小,访问的优先级别就越高。 当函数成员参数和数据成员名称相同时,优先访 问的是函数成员的参数
4.1 作用域 作用域分为面向过程的作用域(C传统的作用域 ) 和 面向对象的作用域。 面向过程的:词法单位的作用范围从小到大可以分为四 级:①作用于表达式内,②作用于函数内,③作用于程 序文件内,④作用于整个程序。 面向对象的:词法单位的作用范围从小到大可以分为五 级:①作用于表达式内,②作用于函数成员内,③作用 于类或派生类内,④作用于基类内,⑤作用于虚基类 内。 标识符的作用域越小,访问的优先级别就越高。 当函数成员参数和数据成员名称相同时,优先访 问的是函数成员的参数
4.1作用域 【例4.1】定义二维及三维坐标上的点的类型。 class POINT2D{ 1定义二维坐标点 ■ int x,yi public: int getx(); //获得点的x轴坐标 POINT2D(intX,inty)X//intx访问优先于数据成员x ■ POINT2D:X=x; //POINT2D:x为类的数据成员x POINT2D:y=yi } ▣i
4.1 作用域 【例4.1】定义二维及三维坐标上的点的类型。 class POINT2D{ //定义二维坐标点 int x, y; public: int getx( ); //获得点的 x轴坐标 POINT2D (int x, int y){ // int x访问优先于数据成员 x POINT2D::x=x; //POINT2D::x为类的数据成员 x POINT2D::y=y; } };
4.1 作用域 class POINT3D{ /川定义三维坐标点 int x,y,zi public: int getx(); /获得点的x轴坐标 POINT3D (int x,int y,int z) POINT3D::X=X; //POINT:3D:x为类的数据成员x ■ POINT3D:y=yi POINT3D:z=Z } i
4.1 作用域 class POINT3D{ //定义三维坐标点 int x, y, z; public: int getx( ); //获得点的 x轴坐标 POINT3D (int x, int y, int z){ POINT3D::x=x; //POINT3D::x为类的数据成员 x POINT3D::y=y; POINT3D::z=z; } };
4.1作用域 /I以下代码在类的体外定义getx(),用:限定getx所属的类 int POINT2D::getx(){return x;} int POINT3D::getx(){return x;} ■ static int x; //C作用域:当前程序文件 void main(int argc,char *argv[]) POINT2D p(3,5); ■ x=p.POINT2D::getx(); ■ x=p.getx()i/等价于x=p.POINT2D:get(): x=POINT2D(4,7).getx(); /以上常量POINT2D(4,7)的作用域局限于表达式 ■}
4.1 作用域 //以下代码在类的体外定义getx( ),用::限定getx所属的类 int POINT2D::getx( ) {return x;} int POINT3D::getx( ) {return x;} static int x; //C作用域:当前程序文件 void main(int argc, char *argv[ ]) { POINT2D p(3,5); x=p.POINT2D::getx( ); x=p.getx( ); //等价于x=p.POINT2D::getx( ) ; x=POINT2D(4,7).getx( ); //以上常量POINT2D(4,7)的作用域局限于表达式 }
4.1作用域 例4.2】用链表定义容量无限的栈。 #include class STACK{ struct NODE int val;NODE *next;NODE(int v);*head; public: ■ STACK(){head=0; ■ STACK(); ■ int push(int v),int pop(int &v); i STACK:NODE:NODE(intv)K//:自左向右结合 ■ val=v; next=0;
4.1 作用域 例4.2】用链表定义容量无限的栈。 #include class STACK{ struct NODE{ int val; NODE *next; NODE(int v); }*head; public: STACK( ){ head=0; } ~STACK( ); int push(int v), int pop(int &v); }; STACK::NODE::NODE(int v){ //::自左向右结合 val=v; next=0; }
.1作用域 【例4.3】定义用于进程管理的类。 static int processes:=1;/总的进程数 extern int fork(); /声明类库提供的fork函数 class Process ■ int processes; //本进程fork的进程数 ■ public: ■ int fork(); ■ i ■ int Process::fork( ■ processes++; //访问数据成员processes processes++; //访问全局变量processes ◆ return fork(); //调用类库中的fok函数 }
4.1 作用域 【例4.3】定义用于进程管理的类。 static int processes=1; //总的进程数 extern int fork( ); //声明类库提供的fork函数 class Process{ int processes; //本进程fork的进程数 public: int fork( ); }; int Process::fork( ){ processes++; //访问数据成员processes ::processes++; //访问全局变量processes return ::fork( ); //调用类库中的fork函数 }
4.1作用域 注意: 。单目运算符:可以限定存储类为static和extern的全局变 量、函数、类型以及枚举元素等。 当同一作用域的标识符和类名同名时,可以用class、 struct和union限定标识符为类名。 【例4.4】定义一个部门的职员。 #include ■ class CLERK char *CLERK; //数据成员CLERK记录职员姓名 :CLERK *next; //等价于class CLERK*next public:
4.1 作用域 注意: 单目运算符::可以限定存储类为static 和extern的全局变 量、函数、类型以及枚举元素等。 当同一作用域的标识符和类名同名时,可以用class 、 struct 和union限定标识符为类名。 【例4.4】定义一个部门的职员。 #include class CLERK{ char *CLERK; //数据成员CLERK记录职员姓名 ::CLERK *next; //等价于class CLERK *next public:
4.1作用域 CLERK(char*s,:CLERK*n)//等价于class CLERK*n ■ H ■ /以下class CLERK:避免访问数据成员char*CLERK ■ CLERK::CLERK(char *name,class CLERK *next=0) CLERK=new char[strlen(name)+1]; strcpy(CLERK,name); ■ CLERK::next=next; /CLERK:next限定访问数据成员 ■ } ■ int CLERK; /定义整型变量CLERK class CLERK w(Wan”,&n);//省略class时类名和变量名混淆
4.1 作用域 CLERK(char *s, ::CLERK*n);//等价于 class CLERK *n }; //以下class CLERK避免访问数据成员char *CLERK CLERK::CLERK(char *name, class CLERK *next=0) { CLERK=new char[strlen(name)+1]; strcpy(CLERK ,name); CLERK::next=next; //CLERK:: next限定访问数据成员 } int CLERK; //定义整型变量CLERK class CLERK w( “Wan ”, &n);//省略class时类名和变量名混淆