C++面向对象程序设计第六章静态成员与友员_第1页
C++面向对象程序设计第六章静态成员与友员_第2页
C++面向对象程序设计第六章静态成员与友员_第3页
C++面向对象程序设计第六章静态成员与友员_第4页
C++面向对象程序设计第六章静态成员与友员_第5页
已阅读5页,还剩24页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1C+C+面向对面向对象程序设计象程序设计内蒙古科技大学 2目 录第一章 概述第二章 C+程序设计初步第三章 函数第四章 数组和指针第五章 类与对象第六章 静态成员与友员第七章 运算符重载第八章 继承与派生第九章 多态性与虚函数第十章 模板第十一章 流类库与输入输出第十二章 命名空间与异常处理3第六章第六章 静态成员与友员静态成员与友员6.2 友元6.1 静态成员4第六章 静态成员与友员n对象的属性 n类的属性 :由类的每个对象所共享的属性n用类的静态成员来表示n类具有封装性 n但为了使类外的函数也能直接访问类中的私有成员,可将该函数声明为友员 56.1 静态成员nC+提出了静态成员的概念n静

2、态成员包括静态数据成员和静态成员函数n其目的是为了实现一个类的不同对象之间的数据和函数共享。6.1.1 静态数据成员6.1.2 静态成员函数66.1.1 静态数据成员n类的非静态数据成员在类的每一个对象中都拥有一个拷贝,即每个对象的同名数据成员可以分别存储不同的数值。n静态数据成员是类的数据成员的一种特例,每个类只有一个静态数据成员拷贝,它由该类的所有对象共同使用和维护,从而实现了同一个类的不同对象之间的数据共享。n静态数据成员不是属于某个对象的,而是属于类的,它由某个类的所有对象所共有。n因为每个类只有一个静态数据成员拷贝,所以在存储方面节省内存,并且它的值对每个对象都是一样的。n只要对静态

3、数据成员的值进行更新,所有对象的该静态数据成员的值都被更新为相同的值。76.1.1 静态数据成员1静态数据成员的定义 静态数据成员定义在类中,在该数据成员名前加关键字static class A private: double a; static int b; ;86.1.1 静态数据成员2静态数据成员的初始化n静态数据成员定义后,必须对它进行初始化,并且一定要在类外进行。静态数据成员定义后,必须对它进行初始化,并且一定要在类外进行。n其初始化的形式如下:其初始化的形式如下: :=; /初始化时不加关键字初始化时不加关键字static class A public: A(double i) a

4、=i;coutCreate one objectendl; private: double a; static int b; ; int A:b=10; /初始化时不加关键字初始化时不加关键字static 96.1.1 静态数据成员3静态数据成员的引用静态数据成员的引用n静态数据成员和一般数据成员一样,在定义时需静态数据成员和一般数据成员一样,在定义时需要规定它的访问控制权限为要规定它的访问控制权限为private、public、protected。n当静态数据成员被声明为私有成员时,只能在类当静态数据成员被声明为私有成员时,只能在类内直接引用它,在类外无法引用。内直接引用它,在类外无法引用。

5、n但当静态数据成员被声明为公有成员或保护成员但当静态数据成员被声明为公有成员或保护成员时,可在类外通过类名对它进行引用。静态数据时,可在类外通过类名对它进行引用。静态数据成员引用的一般形式为:成员引用的一般形式为: :;【例【例6.1】 私有静态数据成员使用举例私有静态数据成员使用举例【例【例6.2】 公有静态数据成员使用举例公有静态数据成员使用举例 106.1.2 静态成员函数n静态成员函数也从属于类,由同一个类的所有对象共同拥有。n所谓静态成员函数,就是使用static关键字声明的成员函数,该函数由同一个类的所有对象共享。n调用静态成员函数的两种形式为: :(); .();116.1.2

6、静态成员函数n静态成员函数只能直接访问该类的静态数据成员、静态成员函数以及类以外的数据和函数,而访问非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。【例【例6.3】 静态成员函数使用举例静态成员函数使用举例 【例【例6.4】 使用静态成员函数引用类以外的函数举例使用静态成员函数引用类以外的函数举例 【例例6.5】 使用静态成员函数访问非静态数据成员举例使用静态成员函数访问非静态数据成员举例 12使用数据成员还应该注意:使用数据成员还应该注意:n如果要通过非静态函数来访问静态数据成员,应该使用非内联函数,而且访问静态数据成员的函数,其函数体的定义应该与静态成员的初始化写在同一

7、个源程序文件中。n这是为什么呢?n因为静态数据成员在被访问之前必须被初始化,而编译器只能保证在调用同一个源文件中定一定任何非静态函数之前,初始化类的静态数据成员。n而一个项目可以由多个源程序文件构成,类的声明和静态数据成员的初始化、成员函数体的定义可以不在同一个源文件中。n在这种情况下,如果使用非静态的内联成员函数访问静态数据成员,有可能出现意料不到的错误136.2 友元 n类外的一些函数有时需要频繁地访问类的类外的一些函数有时需要频繁地访问类的私有成员,可将这些函数定义为该类的友私有成员,可将这些函数定义为该类的友元,使这些函数可以直接访问类的私有成元,使这些函数可以直接访问类的私有成员。员

8、。n友元可以是一个函数,也可以是一个类,友元可以是一个函数,也可以是一个类,分别称为友元函数和友元类。分别称为友元函数和友元类。6.2.1 友元函数友元函数6.2.2 成员函数作友元函数成员函数作友元函数6.2.3 友元类友元类146.2.1 友元函数n友元函数不是当前类的成员函数,但它可以访问该类的所有对象的成员,包括公有成员、保护成员和私有成员。n在类中把普通函数说明为友元函数的形式如下: friend ();n友元函数的说明位置可以在类的任何位置,可以放在公有部分,也可以放在保护部分n如果友元函数定义在类体内,只需要在函数的类型标识符前加关键字friendn如果友元函数定义在类体外,定义

9、形式同一般的普通函数,只需要将加有关键字friend的函数原型放在类体内【例6.6】 使用普通函数作友元函数举例 156.2.2 成员函数作友元函数n一个类的成员函数也可以作为另一个类的友元函数。n这种成员函数不仅可以访问自身所在类对象中的所有成员,还可以访问friend说明语句所在类对象中的所有成员。n在使用该友元函数时要通过相应类的对象名来引用。n成员函数说明为友元函数的形式如下: friend : ();【例6.7】 使用一个类的成员函数作另一个类的友元函数举例166.2.3 友元类n当一个类作为另一个类的友元时,友元类中的所有成员函数都是另一个类的友元函数。n友元类的说明形式为: fr

10、iend class ;n此语句可放在类说明中的公有部分、保护部分和私有部分 【例【例6.8】 一个类作为另一个类的友元举例一个类作为另一个类的友元举例 若若A类为类为B类的友元类,则类的友元类,则A类的所有成员类的所有成员函数都是函数都是B类的友元函数,都可以访问类的友元函数,都可以访问B类的私有和保护成员类的私有和保护成员176.2.3 友元类在使用友元时,需要注意的是:n友元关系不是双向的,即如果将类A说明为类B的友元,那么类A的成员函数就可以直接访问类B的私有成员,但反过来类B成员函数就不可以直接访问类A的私有成员。n友元关系也不是传递的,即类B是类A的友元,类C是类B的友元,而类C不

11、是类A的友元。除非将类C说明为类A的友元,这时类C和类A之间才存在友元关系。n由于友元关系破坏了类的封装性、降低了类的可靠性和可维护性,所以不要滥用友元关系。n友元关系是不被继承的。186.2.4 程序举例【例6.9】编写一个程序实现带头结点链队列的入队列和出队列的程序。其中有两个类:n一个是结点类node,它包含结点值data和指向下一个结点的指针域next;n另一个类是队列类queue,它包含队列的头指针first和尾指针rear -11234firstrear19【例6.1】 私有静态数据成员使用举例(P171)#include class samplepublic: sample (i

12、nt i,int j); void printnumber( ); int printsum( );private: int a,b;static int sum;int sample:sum=0;sample:sample (int i,int j) a=i; b=j; sum+=a+b; void sample:printnumber( )couta,bendl;int sample:printsum( )return sum; void main( ) sample x(1,2),y(3,4); x.printnumber( ); y.printnumber( ); coutx.prin

13、tsum( )endl; couty.printsum( )endl; 20【例6.2】 公有静态数据成员使用举例 (P173)#include class samplepublic:sample (int i,int j); void addnumber();static int sum;private:int a,b;int sample:sum=0;sample:sample (int i,int j) a=i; b=j; void sample:addnumber() sum+=a+b; void main() sample x(1,2),y(3,4); x.addnumber();

14、couts= sample:sumendl; y.addnumber(); couts= sample:sumendl;21【例6.3】 静态成员函数使用举例 (P174)#include int sum=0;class samplepublic:sample (int i,int j); static void addnumber( );private:static int a,b;int sample:a=0;int sample:b=0;sample:sample(int i,int j) a=i; b=j; void sample:addnumber( ) sum+=a+b; void

15、 main() sample x(1,2),y(3,4); sample:addnumber(); coutsum =sumendl; 22【例6.4】 使用静态成员函数引用类以外的函数举例(P175) #include int sum=0;int mulxy(int x,int y) int t; t=x*y; return t; class samplepublic: sample(int i,int j); static void addnumber( );private:static int a,b;int sample:a=0; int sample:b=0;sample:sampl

16、e(int i,int j) a=i; b=j; void sample:addnumber()sum+=a+b+mulxy(2,6); /静态成员函数引用类以外的函数静态成员函数引用类以外的函数void main() sample x(1,2),y(3,4); sample:addnumber(); coutsum =sumendl; 23【例6.5】 使用静态成员函数访问非静态数据成员举例(P176) #include class samplepublic:sample (int i,int j); static void addnumber(sample z);private:int s

17、; static int sum;sample:sample(int i,int j) s=i+j; sum+=s;void sample:addnumber(sample z)couts=z.sendl; /通过对象名引用非静态数据成员通过对象名引用非静态数据成员coutsum=sumendl; /直接引用静态数据成员直接引用静态数据成员int sample:sum=100;void main() sample x(1,2),y(3,4); sample:addnumber(x); /通过类名引用静态成员函数通过类名引用静态成员函数 y.addnumber(y); /通过对象名引用通过对象名

18、引用 静态成员函数静态成员函数 24【例6.6】 使用普通函数作友元函数举例(P177) #include #include class pointpublic: point(double px,double py) x=px;y=py; friend double dist(point &a,point &b);private:double x,y;double dist(point &a,point &b) double distance;distance=sqrt(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);return

19、distance;void main( )point a(4,2),b(10,10); double d=dist(a,b); coutThe distance is: dn; 25【例6.7】 使用一个类的成员函数作另一个类的友元函数举例(P178) #include #include class point;/前向引用声明前向引用声明class pointdistancepublic: double dist(point &a,point &b);class pointpublic: point(double px,double py)x=px;y=py; friend d

20、ouble pointdistance:dist(point &a,point &b);private:double x,y;double pointdistance:dist(point &a,point &b)double distance;distance=sqrt(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);return distance;void main( )point a(4,2),b(10,10); pointdistance pd; double d=pd.dist(a,b); coutThe distance

21、 is:“ dn; 26【例6.8】 一个类作为另一个类的友元举例(P180) #include #include class point;class pointdistancepublic:double dist(point &a,point &b);class pointpublic:point(double px,double py)x=px;y=py;friend class pointdistance;private:double x,y;double pointdistance:dist(point &a,point &b)double distance;distance=sqrt(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);return distance;void main()point a(4,2),b(10,10); pointdistance pd; coutThe distance is:“ pd.dist(a,b)n; 27【例6.9】编写一个带头结点链队列

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论