第5章类和对象2

上传人:壹****1 文档编号:498057418 上传时间:2023-02-02 格式:DOC 页数:44 大小:95.50KB
返回 下载 相关 举报
第5章类和对象2_第1页
第1页 / 共44页
第5章类和对象2_第2页
第2页 / 共44页
第5章类和对象2_第3页
第3页 / 共44页
第5章类和对象2_第4页
第4页 / 共44页
第5章类和对象2_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《第5章类和对象2》由会员分享,可在线阅读,更多相关《第5章类和对象2(44页珍藏版)》请在金锄头文库上搜索。

1、5.5静态成员局部变量:一般来讲就是具有块作用域 的变量。如果把数据存储在局部变量中,函 数在不同的块之间只能通过参数传递来共享 数据。优点:在不同的函数体内互相不可见,很 好地实现了函数之间的数据隐藏缺点:比较适合共享少量数据。全局变量:在整个程序中,除了在定 义有同名局部变量之外,都可以进行直接访 问。优点:实现了数据的共享缺点:无法对数据的访问权限进行有效的 控制。例 5.13 #in eludeint global;void f( global=5; coutvoid g( global=6; coutvoid fun( int global=10; coutvoid mai n( f

2、 (;g (;fun(;coutv执行结果:106全局变量在整个程序中(除了在定义有同名 局部变量之外都是可见的。为了安全起见, 不使用全局变量,而使用静态数据成员。静态数据成员静态数据成员可以实现多个对象之间的数 据共享,并且不会破坏安全性。静态数据 成员是属于所有对象的。静态数据成员的使用方法:1. 静态数据成员在定义或说明时前面加 static关键 字。例如:class Nclassprivate:int a,b,c;static int n;2. 静态数据成员是静态存储的,必须进行初始化格式:数据类型类名:静态数据成员名=值;例如:class Nclassprivate:int a,b

3、,c;static int n;int Nclass: n=10;,属于类。,访问时可3. 静态数据成员不专属于任何一个对象 如果访问权限允许的话(public ) 用:类名::静态数据成员名例 5.14#i ncludeclass Myclass public:Myclass(i nt a,i nt b,i nt c;void GetNumber(;void GetSum(;private:int A,B,C;static int Sum; /静态数据成员说明;int Myclass:Sum=O; /静态数据成员初始 化Myclass:Myclass(i nt a,int b,i nt c数

4、据成员2(参数,coutvv ” Number=”TDate3:TDate3(int y,int m,int d” ” coutvv ” :Constructor可以:TDate3:TDate3(int y,int m,int dyear(y,m on th(m,day(dSum= coutvvv ”:Constructorcalled n”void mai n(例M.GetNumber(;N.GetNumber(;M.GetSum(;N.GetSum(;A(i nt x:a(x Number=3, 7,class BNumber=14B(int x,int y:aa(x,b(y Sum=54

5、Sum=54 aa=例 5.15#i ncludeclass Countprivate:public:Cou nt( ;void main(void Shows输出:aa=3private:b=5以上不能: static int sum; aa. a=x; b=y; int Count:sum=100;void mai n( Cou nt c1;c1. Showsum(;拷贝初始化构造函数c4. Showsum(;功能:输出:格式:类名::拷贝初始化构造函数名(const类名&引用名Showsum(sum的。要输出只能通过某个对象来调用函数Showsum(3.如果类中没有说明拷贝初始化构造函

6、数,则系统自动生成一个缺省拷贝初始化构 造函数。例5.9/tpoi ntl.h为了解决这个问题,如果TPo in t(TPo int &p;sum;编译错误。因为对普通成员函数的调用必须通过对象名。 coutvv米用静态成员函数来解决 上述问题。例int Xcoord( return X;int Y coord( return Y;public:Count( int X,Y;;TPoint:TPoint(TPo int &p X=p.X;sum +;Copy_initialization Constructor Calledn” ;coutv” tpoint1 h ” static int s

7、um;int Count:sum=100;coutvv void main(P2=” v ”,cl. Showsum(;v输出:Copy_initialization Constructor Called.输出:1005.10拷贝初始化构造函数的其他用法。” tpointl.h1. TPoint f(TPoint Q;关键字声明的成员函数。2. 同静态数据成员一样,静态成员函数属于整个 类,为所有对象所共享。P(0,0;对于公有的静态成员函数,可以通过类名或对象 名来调用;而一般的非静态成员函数只能通过对象名 来调用。P=f(N;coutvv ” P=”静态成员函数可以直接访问该类的静态数据和

8、函数成 员;而访问非静态数据成员,必须通过参数传递方式 得到对象名,然后通过对象名来访问。举例说明:例 5.17 coutvvstatic void f1(M m;int x,y;int代static int B;输出:Called.Copy_i nitializatio nCon structorvoid M:f1(M mCopy_i nitializatio n Con structorCalled.coutvvB=vv B 直接OkCopy_i nitializatio n Con structor Called.void main(释放对象QDestructor Called.释放匿名

9、对象P=30,55Destructor Called.A=5B=15Destructor Called. 释放对象 PDestructor Called.释放对象 M例5.18王婆卖西瓜。每卖一个瓜,计算出该瓜的重量、总重量、总个数,还允许退 瓜。象。class Watermel on public: 2.P=f(N;3.当对象作为函数返回值时。系 统用返回值初始化一个匿名对象时使用了拷 贝初始化构造函。return R;total_number+; 5.4成员函数的特性Watermelo n(一般成员函数 void display(;private:float weigh t;内联函数和外联

10、函数内联函数:定义在类体内的成员函数。外联函数:说明在类体内,定义在类体外 的成员函数。int Watermel on:total_ nu mber=0;void Watermelo n:display(例 5.11class A public:cout A(int x,intyX=x; Y=y;内联函数int a( return X;内联函数 coutvv ” Total weight is:vint X,Y;inline int A:c(vvoid main(Watermelo n w1(3.5;void main(Watermelo n:total_disp(;Watermelo n w

11、2(4.5;coutvvWatermelo n:total_disp(;Watermelo n w3(5.6; w3. display(;输出:d( return:85.class MM(i nt x,i nt yX=x; Y=y;M(i nt xX=x; Y=x*x; int Add(i nt x,i nt y;int Add(i nt x;友元函数int Xout( return X;int Y out( return Y;private:int X,Y; X=x; Y=y; return X+Y;int M:Add(i nt x X=Y=x; return X+Y;int M:Add(

12、return X+Y;#in elude coutvvcoutvv ” a=” coutvvdouble getx( retur n x;double gety( retur n y;private:double x,y;double dista nce(Poi nt & a,Poi nt &30 double dx= a.getx( -b.getx( ;double dy=a .gety( -b. gety(;return sqrt(dx*dx+dy*dy;void main( Poi nt p1(3.0,4.0, p2(6.0,8.0;pl. Getxy(;p2. Getxy(;coutv

13、v ” Distanee is ” vvdistance(p1,p2v输出:(3.0,4.0(6.0,8.0Dista nee is 5分析:dis ntan ce( 这个函数是一个普通函 数,如果想访问类的私有成员,必须通过类 的接口函数getx(和gety(来实现。缺点: 成员函数多次调用,由于参数传递、类型检 查和安全性检查需要时间开销,程序的运行 效率不高。有没有办法使类外的函数直接访问私有数 据成员呢?有,使用友元函数。例5.20使用友元函数。#i nclude#i ncludeclass Point public:Poi nt(double m,double n x=m;y=n;v

14、oid Getxy( coutvv (,frie nd double dista nce(Po int &aPoi nt &b;private:double x,y;double dista nce(Poi nt & a,Poi nt &b double dx= a.x - b.x ;double dy= a.y-b.y ;retur n sqrt(dx*dx+dy*dy;void main( Poin t p1(3.0,4.0, p2(6.0,8.0;p1. Getxy(;p2. Getxy(;coutvv ” Distanee is ” vvdistance(p1,p2v输出:(3.0,4.0(6.0,8.0Dista nee is 5友元函数的特点:1. 友元函数是普通函数,不是成员

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号