资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+面向对象程序设计第六章 数据共享和成员特性,陈春丽,第六章 数据共享和成员特性,6.,1,this指针,6.,2,类的友元,6.,3,类的静态成员,6.,4,const成员,6.,1,this指针,隐含于每一个类的成员函数中的特殊指针,识别成员函数,当前,操作的对象,类的每个,非静态成员函数,都含有一个指向当前对象的指针,即,this,指针,类的非静态成员函数中访问数据成员时,隐含形式是“,this-,数据成员名,”,this,指针的使用,class Point,public:,Point( int x = 0, int y = 0 ), xPos = x;yPos = y; ,void,a,dd( Point two), xPos,+=,two.xPos;,yPos,+=,two.yPos;,void,p,rint(),cout,xPos,“,“,xPos,/yPos,等价于,this-,yPos,void main(),CPoint,pt(1, 2), pt2(3, 4);,pt.,a,dd( pt2 );,pt.,p,rint();,pt.,a,dd( pt2 );,a,dd(,void,a,dd( Point *this, Point two),t,his,-,xPos += two.xPos;,6.,2,类的友元,友元是,C+提供的一种破坏数据封装和数据隐藏的机制,外界只能访问类的public成员,通过,friend,修饰符,将一个模块声明为另一个模块的友元,则该友元能够引用到另一个模块中隐藏的信息,可以使用,友元函数,和,友元类,为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元,友元函数,友元函数是在类声明中说明的非成员函数,由关键字,friend修饰,该友元函数体中能够通过对象名访问 private 和 protected成员,作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择,访问对象中的成员必须通过对象名,例:计算两点距离,(不用友元函数),#include ,#include ,using namespace std;,class Point,public:,Point(int,x=0, int,y=0) ,xPos,=x;,yPos,=y;,int,g,etX() return,xPos,;,int,g,etY() return,yPos,;,private:,int,xPos, yPos,;,;,double Distance( Point&,a, Point&,b),double,dx=a.,getX(),-b.,getX(),;,double dy=a.,getY(),-b.,getY(),;,return sqrt(dx*dx+dy*dy);,int main(),Point p1(3.0, 5.0), p2(4.0, 6.0);,double d=Distance(p1, p2);,coutThe distance is dendl;,例:使用友元函数计算两点距离,class Point, public:,friend,double,Distance(Point &,a, Point &,b);,private:,int,xPos, yPos,;,;,double Distance( Point&,a, Point&,b),double,dx=a.,xPos,-b.,xPos,;,double dy=a.,yPos,-b.,yPos,;,return sqrt(dx*dx+dy*dy);,int main(),友元类,若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员,声明语法:将友元类名在另一个类中使用,friend修饰说明,友元关系是单向的,若声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据,class A,friend class B;,public:,void Display() coutxendl;,private:,int x;,class B,public:,void Set(int i) ,a.x=i;,void Display(); a.Display();,private:,A a;,;,6.,3,类的静态成员,静态成员:解决同一个类的不同对象之间数据和函数的共享,例如:雇员总数这个值为雇员类的所有对象所共享,静态数据成员,用关键字,static,声明,该类的所有对象维护该成员的同一个拷贝,必须在,类外初始化,,用,(:)来指明所属的类。,例:具有静态数据成员的,Point类,class Point,public:,Point(int x=0, int y=0) ,xPos,=x;,yPos,=y; countP+; ,void,g,etC() cout Object id=countPendl;,private:,int,xPos,yPos;,static int countP;,;,int Point:countP=0;,void,main(),Point A(4,5), B(3,2),;,coutPoint A,A.,g,etX(),A.,g,etY();,A.,g,etC();,coutPoint B,B.,g,etX(),B.,g,etY();,B.,g,etC();,程序的运行结果为:,Point A,4,5 Object id=1,Point B,3,2,Object id=2,静态成员函数,静态成员函数是专门引用属于该类的静态数据成员或静态成员函数的函数,例如:定义了静态数据成员:雇员总数,但是该成员为私有,必须定义公有函数成员来实现雇员总数加一、输出值等功能,类外代码可以使用类名和作用域操作符来调用静态成员函数,静态成员函数举例,#include,using namespace std;,class,Application,public:,static void f();,static void g();,private:,static int global;,;,int Application:global=0;,void Application:f(), global=5; ,void Application:g(), coutglobalendl; ,int main(),Application:f();,Application:g();,return 0;,class A,public:,static void f(A a);,private:,int x;,;,void A:f(A a),coutx; /对x的引用是错误的,couta.x; /正确,静态成员函数举例:,访问非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名访问,具有静态数据、函数成员的,Point类,class Point,public:,Point(int x=0, int y=0) ,xPos,=x;,yPos,=y; countP+; ,static,void,g,etC() cout“ id=countPendl;,private:,int,xPos,yPos;,static int countP;,;,int Point:countP=0;,int main()/主函数实现,Point A(4,5);/声明对象A,A.,g,etC();/输出对象号,对象名引用,Point:,g,etC();/输出对象号,类名引用,6.,4,const成员,常类型的对象必须进行初始化,而且不能被更新,常引用:被引用的对象不能被更新。,const 类型说明符 &引用名,常对象:该对象的数据成员值在对象的整个生存期间内不能被改变。即必须进行初始化,且不能被更新,类名 const 对象名,例:常引用作形参,#include,void display(const double,int main(),double d(9.5);,display(d);,return 0;,void display(,const double& r,),/常引用作形参,在函数中不能更新 r所引用的对象。, coutrendl; ,常对象举例,class A,public:,A(int i,int j) x=i; y=j;,.,private:,int x,y;,;,A const a(3,4);,/a是常对象,不能被更新,用,const修饰的对象成员,常成员函数:使用,const关键字说明的函数,常成员函数不更新对象的数据成员,只能调用const常成员函数,常成员函数说明格式:,类型说明符 函数名(参数表),const;,这里,,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。,const关键字可以被用于参与对重载函数的区分,如void print(); 和void print() const;重载,常数据成员,使用const说明的数据成员,例:常成员函数举例,#include,using namespace std;,class R,public:,R(int r1, int r2)R1=r1;R2=r2;,void print();,void print() const;,private:,int R1,R2;,;,void R:print(), coutR1:R2endl; ,void R:print() const, coutR1;R2endl; ,int main(),R a(5,4);,a.print(); /调用void print(),const R b(20,52);,b.print(); /调用void print() const,例:常数据成员举例,#include,using namespace std;,class A,public:,A(int i);,void print();,const int,private:,const int a;,static const int b;,;,const int A:b=10;,A:A(int i):a(i),r(a), ,void A:print(), couta:b:rendl; ,int main(),/*建立对象a和b,并以100和0作为初值,分别调用构造函数,通过构造函数的初始化列表给对象的常数据成员赋初值*/,A a1(100),a2(0);,a1.print();,a2.print();,
展开阅读全文