资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第6章 静态成员与友元,6.1 静态成员 6.2 友元函数 6.3 友元类,6.1 静态成员,6.1.1 静态数据成员 6.1.2 静态成员函数,返回首页,6.1.1 静态数据成员,C+中,同一个类定义多个对象时,每个对象拥有各自的数据成员(不包括静态数据成员),而所有对象共享一份成员函数和一份静态数据成员。静态数据成员是类的所有对象中共享的成员,而不是某个对象的成员,因此可以实现多个对象间的数据共享。静态数据成员不属于任何对象,它不因对象的建立而产生,也不因对象的析构而删除,它是类定义的一部分,所以使用静态数据成员不会破坏类的隐蔽性。,静态数据成员的使用方法如下: (1)静态数据成员的定义与一般数据成员相似,但前面要加上static关键词。 (2)静态数据成员的初始化与一般数据成员不同,静态数据成员初始化的格式如下: :=; (3)在引用静态数据成员时采用格式: : (4)静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。,例6-1:用静态数据成员实现班会费管理程序。 #include class person char* name; int age; static int count; /定义静态成员,存放班会费 public: void setData(char* s,int n)name=s;age=n; void getData(int n)count=count+n; void spend(int n)count=count-n; void display()coutcountendl; ;,int person:count=0;/为静态数据成员分配空间和初始化 void main() person demo1,demo2; demo1.setData(Robert,21); demo2.setData(Mary,18); demo1.getData(1000); demo2.display(); /输出1000 demo2.spend(300); demo1.display(); / 输出 700 ,返回本节,6.1.2 静态成员函数,静态成员函数与静态数据成员类似,也是从属于类,静态成员函数的定义是在一般函数定义前加上static关键字。调用静态成员函数的格式如下: :(); 静态成员函数与静态数据成员一样,与类相联系,不与对象相联系,只要类存在,静态成员函数就可以使用,所以访问静态成员函数时不需要对象。静态成员函数没有this指针,因此,静态成员函数只能直接访问类中的静态成员,若要访问类中的非静态成员时,必须借助对象名或指向对象的指针。,例6-3:用静态成员函数实现班会费管理程序。 #include class person char* name; int age; static int count; /定义静态成员,存放班会费 public: void setData(char* s,int n)name=s;age=n; void getData(int n)count=count+n; void spend(int n)count=count-n; static void display()coutcountendl; /定义静态成员函数 ;,int person:count=0;/为静态数据成员分配空间和初始化 void main() person demo1,demo2; demo1.setData(Robert,21); demo2.setData(Mary,18); demo1.getData(1000); person:display(); /用类名去调用静态成员函数 demo2.spend(300); demo1.display(); /用对象的类型去调用静态成员函数 ,例6-4:写出下面程序的执行结果。 #include class M public: M(int a) A=a;B+=a; static void f1(M m); private: int A; static int B; ; void M:f1(M m) ,coutA=m.Aendl; /在静态成员函数中,只能通过对象访问类的非静态成员 coutB=Bendl; /B是静态成员,可以在静态成员函数中访问 int M:B=0; void main( ) M P(5), Q(10); M:f1(P); /访问静态成员函数,前面必须是类名,下同 M:f1(Q); 输出结果为: A=5 B=15 A=10 B=15,返回本节,6.2 友元函数,6.2.1 友元函数的说明 6.2.2 友元函数的使用,返回首页,6.2.1 友元函数的说明,定义友元函数的方式是在类定义中用关键词friend说明该函数,其格式如下: friend (); 友元函数说明的位置可在类的任何部位,既可在public区,也可在protected区,意义完全一样。友元函数定义则在类的外部,一般与类的成员函数定义放在一起。,例6-5:友元函数示例程序。 #include class person friend void display(person*);/声明友元函数 char *name; int age; public: person(char *str,int i) name=str; age=i; ;,void display(person* a)/定义友员函数 coutnameageendl; void main() person demo(dsc,30); display(/调用友员函数,不要指明对象名 运行结果为: dsc30,例6-6:将其他类的成员函数定义为类的友元。 #include class A; class B public: int,class A public: void addout(B ,B:B() pA=new A; B:B(B, int 运行结果为: The address of A in B is 0 x00430030 b.pA-i=1,返回本节,6.2.2 友元函数的使用,友元函数与其他普通函数的不同之处在于:友元必须在某个类中说明,它拥有访问说明它的类中所有成员的特权;而其他普通函数只能访问类中的公有成员。 友元说明可以出现在类的私有部分、保护部分和公有部分,但这没有任何区别。应说明的是:使用友元虽然可以提高程序的运行效率,但却破坏了类的封装性。因此,在实际应用中应慎重使用友元。,例6-7:分析下面程序的运行结果。 #include #include class Point public: Point(double xx,double yy) x=xx;y=yy; void Getxy( ); friend double Distance(Point ,double Distance(Point void main( ), Point p1(1.0,2.0),p2(3.0,4.0); p1.Getxy( ); p2.Getxy( ); double d=Distance(p1,p2); coutDistance isdendl; 输出结果: (1,2) (3,4) Distance is2.82843,返回本节,6.3 友元类,C+允许说明一个类为另一个类的友元类(friend class)。 如果A是B的友员类,则A中的所有成员函数可以像友员函数一样访问B类中的所有成员。定义格式如下: class B friend class A;/A的所有成员函数均为B的友元函数 / 友元关系不可以被继承。假设类A是类B的友元,而类C从类B派生,如果没有在类C中显式地使用下面的语句: friend class A;,返回首页,例6-8:分析以下程序的执行结果。 #include class B; class A int i; public: int set(B,friend A; ; int A:set(B 此程序的运行结果为: 1,2,返回本节,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号