1、int a,b,c;static int n;2.静态数据成员是静态存储的,必须进行初始化。格式:数据类型 类名:静态数据成员名=值;int Nclass:n=10;3.静态数据成员不专属于任何一个对象,属于类。如果访问权限允许的话(public),访问时可用:类名:静态数据成员名例5.14class Myclass public:Myclass(int a,int b,int c;void GetNumber( ;void GetSum( ;int A,B,C;static int Sum; /静态数据成员说明;int Myclass:Sum=0; /静态数据成员初始化Myclass:Myc
2、lass(int a,int b,int c数据成员2(参数,”Number=”TDate3:TDate3(int y,int m,int d” ”cout”:Constructor called.n”; 可以:TDate3(int y,int m,int d:year(y,month(m,day(dSum= cout ” :Constructor called.n ”例M.GetNumber( ;N.GetNumber( ;M.GetSum( ;N.GetSum( ;A(int x:a(x Number=3,7,class BNumber=14B(int x,int y:aa(x,b(y S
3、um=54Sum=54”aa=例5.15class Countpublic:Count( ;void Shows输出:aa=3b=5以上不能:static int sum; aa.a=x; b=y; int Count:sum=100;void main( Count c1;c1.Showsum( ;5.3.3 拷贝初始化构造函数c4.Showsum( ;功能:拷贝初始化构造函数名(const 类名 &引用名Showsum( sum的。要输出只能通过某个对象来调用函数Showsum( 3.如果类中没有说明拷贝初始化构造函数,则系统自动生成一个缺省拷贝初始化构造函数。例5.9 5.5.2/tpo
4、int1.h为了解决这个问题,如果TPoint(int x,int yX=x;Y=y;了TPoint(TPoint &p;sum;编译错误。因为对普通成员函数的调用必须通过对象名。 cout采用静态成员函数来解决上述问题。int Xcoord( return X;int Ycoord( return Y; public:Count( int X,Y;TPoint:p X=p.X;sum +;”Copy_initialization Constructor Called.n”;cout”tpoint1.h” static int sum;P2=” ” , Copy_initialization
5、Constructor Called.1005.10 拷贝初始化构造函数的其他用法。”tpoint1.h1.TPoint f(TPoint Q;关键字声明的成员函数。2.同静态数据成员一样,静态成员函数属于整个类,为所有对象所共享。P(0,0;对于公有的静态成员函数,可以通过类名或对象名来调用;而一般的非静态成员函数只能通过对象名来调用。 P=f(N;”P=”静态成员函数可以直接访问该类的静态数据和函数成员;而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。举例说明:例5.17”static void f1(M m;int x,y;int A;static int B
6、;void M:f1(M m B=B 直接 Ok 释放对象QDestructor Called. 释放匿名对象P=30,55Destructor Called. A=5B=15Destructor Called.释放对象PDestructor Called. 释放对象M例 5.18 王婆卖西瓜。 每卖一个瓜,计算出该瓜的重量、总重量、总个数,还允许退瓜。1.明确表示由一个对象初始化另一个对象。class Watermelon2.P=f(N;3.当对象作为函数返回值时。系统用返回值初始化一个匿名对象时使用了拷贝初始化构造函。return R;total_number+;5.4 成员函数的特性Wa
7、termelon( 一般成员函数void display( ;特殊成员函数 float weight;5.4.1 内联函数和外联函数内联函数:定义在类体内的成员函数。外联函数:说明在类体内,定义在类体外的成员函数。int Watermelon:total_number=0;void Watermelon:display( 例5.11class A A(int x,int yX=x; 内联函数 int a( return X; 内联函数”Total weight is:int X,Y;inline int A:c( Watermelon w1(3.5;Watermelon:total_disp(
8、 ;Watermelon w2(4.5;Watermelon w3(5.6;w3.display( ;d( return:85.4.2 5class MM(int x,int yX=x;M(int xX=x;Y=x*x;int Add(int x,int y;int Add(int x;5.6.1友元函数int Xout( return X;int Yout( return Y; X=x; Y=y; return X+Y;int M:Add(int x X=Y=x;Add( return X+Y;”a=” ” ” ” double getx( return x;double gety( ret
9、urn y;double x,y;double distance(Point &a,Point &30 double dx=a.getx( -b.getx( ;double dy=a.gety( -b.gety( ;return sqrt(dx*dx+dy*dy; Point p1(3.0,4.0, p2(6.0,8.0;p1.Getxy( ;p2.Getxy( ;”Distance is ”distance(p1,p2(3.0,4.0(6.0,8.0Distance is 5分析:disntance( 这个函数是一个普通函数,如果想访问类的私有成员,必须通过类的接口函数getx( 和gety
10、( 来实现。成员函数多次调用,由于参数传递、类型检查和安全性检查需要时间开销,程序的运行效率不高。有没有办法使类外的函数直接访问私有数据成员呢?有,使用友元函数。例5.20使用友元函数。class PointPoint(double m,double n x=m;y=n;void Getxy( ”(“ ” , ” 12 time.hours-=12;”PM”else”AM”void Time24(Time time Time Time1(20,30,Time2(10,45;Time12(Time1;Time24(Time1;Time12(Time2;Time24(Time2;8:30PM 20
11、:10:45AM45在本例中,友元函数是一个普通函数,同样,这个函数也可以是另外一个类的成员函数。5.6.2友元类同函数一样,类也可以声明为另一个类的友元,这时称为友元类。若A类为B类的友元类,则A类的所有成员都是B类的友元函数,都可以访问B类的私有和保护成员。例5.22 分析下列程序的输出结果:class X friend class Y; /Y类是X类的友元类void Set(int ix=i;void Display( ”x=” ” ,y= ” int x;static int y;class YY(int i,int j a.x=i; X:y=j; ” , y= ” X a;int X
12、:y=1; X b;b.Set(5;b.Display( ;Y c(6,9;c.Display( ;x=5,y=1x=6,y=9x=5,y=9说明:1.一般来说,在一个类的成员函数中,不能引用另一个类的私有成员,但在友元类中可以。2.X类的y是静态成员,通过Y类的对象c改变了它的值后,将仍然保存其值,在X类的对象b中,y成员的值仍然是改变后的值。可见,Y类对象与X类对象共用静态成员y。注意:1.友元关系不能传递。B类是A类的友元,C类是B类的友元,C类和A类之间,如果没有声明,就没有任何关系,不能进行数据共享。2.友元关系是单向的。B类是A类的友元,B类的成员函数可以访问A类的私有和保护数据,
13、但A类的成员函数却不能访问B类的私有和保护数据。5.7 类的作用域类的作用域(类域:类的定义中由一对花括号括起来的部分。在类域中定义的变量不能使用auto,register和extern等修饰符。类域包含在文件域中。5.8 局部类和嵌套类5.8.1 局部类局部类:在一个函数体内定义的类。int a; static int s;class A;void init(int is=i;A m;m.init(10;5.8.2 嵌套类嵌套类:在一个类中定义的类。void f( ;5.9 对象的生存期对象的生存期:指对象从被创建到被释放为止的时间。按生存期可分:1.局部对象:当对象被定义时调用构造函数,当
14、程序退出定义该对象所在的函数体或程序块时,释放对象。2.静态对象:当程序第一次执行所定义的静态对象时,该对象被创建,当程序结束时,该对象被释放。3.全局对象:当程序开始时,调用构造函数创建对象,当程序结束时,该对象被释放。局部对象定义在函数体或程序块内。静态对象定义在一个文件中。全局对象定义在某个文件中。例5.23 不同对象的生存期A(char *st strcpy(string,st;”Constructor called for”A( ”Destructor called for”char string50; A FunObject(“FunObject”; 局部对象static A st
15、aticObject(“StaticObject”;静态对象”In fun( .”A GlobalObject(“GlobalObject”; 全局对象 A MainObject(“MainObject”;”In main( ,befor called funn”;”In main( ,after called funn”;Constructor called for GlobalObjectConstructor called for MainObjectIn main( ,befor called funConstructor called for FunObjectConstructor
16、 called for StaticObjectIn fun( .Destructor called for FunObjectIn main( ,after called funDestructor called for MainObjectDestructor called for StaticObjectDestructor called for GlobalObject作业:1.设立一个立方体类Box,在该类定义中包括:数据成员:length,width和height。成员函数:(1Box( 设置盒子的长、宽和高;(2volume( 计算盒子的体积;(3area( 计算盒子的表面积;(4disp( 输出盒子的体积和表面积。在main( 中创建对象,求盒子的体积和表面积,输出体积和表面积。2.定义一个Book类,在该类定义中包括:bookname,price和number;(1Book( 为对象赋初值。(2display( 显示图书的情况。3.遍写一个程序,输入N个学生数据,包括学号、姓名、成绩、要求输出这些学生数据并计算平均分。4.第5章后面的作业题四。练习:第5章后面的练习题和作业题一、二、三。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1