中国高校课件下载中心 》 教学资源 》 大学文库

华中科技大学:《面向对象程序设计》课程教学资源(课件讲稿)第4章 作用域及成员指针

文档信息
资源类别:文库
文档格式:PDF
文档页数:53
文件大小:128.53KB
团购合买:点击进入团购
内容简介
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章 作用域及成员指针 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时类名和变量名混淆

刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档