友元静态及类模板.ppt_第1页
友元静态及类模板.ppt_第2页
友元静态及类模板.ppt_第3页
友元静态及类模板.ppt_第4页
友元静态及类模板.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、3.9 静态成员,3.9.1 静态数据成员,静态数据成员初始化格式如下: 类型 类名:静态数据成员名= 值; 例如: int A:sum=0;,静态数据成员声明格式如下: static 类型 静态数据成员名; 例如: static int sum;,在类内,在类外,class A public: A(int x,int y) /构造函数 a=x;b=y; A( ) /构造函数 void getXY() /成员函数 coutX=atY=bendl; void getSUM() /成员函数 sum=sum+a+b; coutSUM=sumendl; private: int a,b; static

2、 int sum; /静态数据成员声明 ; int A:sum=0; /静态数据成员在类体外的初始化 void main() A a1(1,2); a1.getXY(); a1.getSUM(); A a2(3,4); a2.getXY(); a2.getSUM(); ,例如:#include class A public: static int x; /声明公有的静态数据成员 ; int A:x=10; void main() coutA:xendl; A:x=20; /通过类名访问静态数据成员 coutA:xendl; ,格式如下: 类名:静态数据成员名,3.9.2 静态成员函数,#inc

3、lude class A public: A(int x1,int x2) x=x1; y=y+x2; A() static void fun1() cout “Y= ”yendl; /静态成员函数 static void fun2(A a); /声明静态成员函数 private: int x; static int y; ; void A:fun2(A a) cout X=a.xtY=yendl; int A:y=0; /静态成员初始化 void main() A a(1,2); a.fun1(); /通过对象名访问 A:fun2(a); /通过类名访问 ,案例 静态成员函数。,3.10.1

4、 友元函数,3.10 友元,#include class A /声明类A public: void memberfun (int x); /成员函数 ; class B /声明类B public: B( ) /构造函数 B(int x1) /构造函数 x=x1; B( ) /析构函数 void getX() /成员函数 cout X= xendl; friend void fun(); /友元函数声明 friend void A:memberfun(int x); /友元函数声明 private: int x; ;,void A:memberfun(int x) /A类的成员函数,也是B类的友

5、元函数 B b(0); /声明B类的对象b,初始值为0 cout X= b.xendl; b.x=x; cout X= b.xendl; void fun() B b(10); /声明B类的对象b,初始值为10 cout X= b.xendl; void main() fun(); /调用友元函数 A a; /声明A类的对象a a.memberfun(100); /调用友元函数 ,(续),3.10.2 友元类,class Date private: int year, month, day; public: Date(int y, int m, int d) year=y; month=m;

6、day=d; friend class Clock; /声明Clock类为Date类的友元类 ; class Clock /声明Clock类 public: void ShowNowDate(Date ,模板(templates),一、模板( Templates )的概念。,模板是根据参数类型生成函数和类的机制(有时称为“参数决定类型”)。通过使用模板,可以只设计一个类来处理多种类型的数据,而不必为每一种类型分别创建类。 例如,我们要实现一个加法函数,他能够对两个参数求和,并根据参数的类型返回具有适当类型的值 。如果不使用Templates,必须要编写一系列如下的重载函数:,一、模板( Tem

7、plates )的概念。,shortsum(shorta,shortb) returna+b; intsum(inta,intb)returna+b; floatsum(floata,floatb)returna+b; 非常麻烦,可以用c+的模板函数来表达“通用型的函数”。 template Tsum(Ta,Tb) returna+b; 模板能够减少源代码量并提高代码的机动性而不会降低类型安全。,一、模板( Templates )的概念,现在,c+编译器可以根据我们调用sum函数的参数类型“现场”生成一个适当的函数,然后调用它。例如: #include intmain(void) floatf

8、a=1,fb=3,fs; fs=sum(fa,fb); cout”sum(float,float)1and3=”fsendl; ,一、模板( Templates )的概念,模板分为函数模板和类模板两种。 采用模板方式定义函数或类时不确定某些函数参数或数据成员的类型,而将它们的数据类型作为模板的参数。在使用模板时根据实参的数据类型确定模板参数(数据类型)的数据类型。 模板提高了软件的重用性。当函数参数或数据成员可以是多种类型而函数或类所实现的功能又相同时,使用C+模板在很大程度上简化了编程。,类模板,函数模板只能用于定义非成员函数,它是模板的一个特例。类模板实际上是函数模板的推广,它是一种不确定

9、类的某些数据成员的类型或成员函数的参数及返回值的类型的类。,1. 类模板与函数模板,2. 类模板与类,类是对问题的抽象,而类模板是对类的抽象,即更高层次上的抽象。,类模板称为带参数(或参数化)的类,也称为类工厂,它可用来生成多个功能相同而某些数据成员的类型不同或成员函数的参数及返回值的类型不同的类。,为了起到模板的作用,与函数模板一样,定义一个类模板时必须将某些数据类型作为类模板的类型参数。 模板类的实现代码与普通类没有本质上的区别,只是在定义其成员时要用到类模板的类型参数。,3. 类模板的定义,例如,以下定义了含有一个类型参数的类模板:,template class MyTemClass p

10、rivate: T x; / 类型参数T用于声明数据成员 public: void SetX( T a ) x=a; ; / 类型参数T用于声明成员函数的参数 T GetX( ) return x; ; / 类型参数T用于声明成员函数的返回值 ;,如果在模板类的外部定义模板类的成员函数,必须采用如下形式: template / 不能省略模板声明 void MyTemClass : SetX( T a ) x=a; (每个定义都要模板声明),注意:,4. 类模板的实例化,与函数模板不同,类模板不是通过调用函数时实参的数据类型来确定类型参数具体所代表的类型,而是通过在使用模板类声明对象时所给出的实

11、际数据类型确定类型参数。,例如,以下使用类模板声明了一个类型参数为int的模板类的对象: MyTemClass intObject;,对于上面的对象声明: 编译器首先用int替代模板类定义中的类型参数T,生成一个所有数据类型已确定的类class; 然后再利用这个类创建对象intObject 。,5. 含有多个参数类模板的定义,template class MyTemClass . . . ,例如,声明模板类的对象应采用如下形式: MyTemClass MyObject ;,例 使用多个类型参数的类模板。,template / 使用2个类型参数 class MyTemClass/ 定义模板类 p

12、rivate: T1 x; T2 y; public: MyTemClass(T1 a, T2 b) x=a; y=b; ; void ShowMax() cout=y?x:y)endl; ; ;,void main() int a=100; float b=123.45F; MyTemClass mt(a, b); / 声明模板类的对象 mt.ShowMax(); ,类模板 的实例化,小 结,1. C+语言中,类是一种用户自定义数据类型,是一组变量及其相关函数的组合。类中的变量称为类的成员变量或数据成员;函数称为类的成员函数。类成员按访问控制权限分为3类:私有成员、保护成员和公有成员。 2.

13、 类的成员函数可以带默认形参值,也可以定义为内联函数。而且,除析构函数外,都可以重载。 3. 对象是类的实例。声明对象时,可以同时初始化其数据成员。不过,对象数据成员的初始化需要通过类的构造函数进行。而对象终止时,系统需要调用析构函数。 4. 如果一个对象在程序运行过程中其值不变,就应该把它声明为常对象。 5. 类的数据成员可以声明静态数据成员,也可以声明为常数据成员;类的成员函数同样可以声明为静态成员函数或常成员函数。,小 结(续),6. 类的数据成员可以是类类型。这种数据成员包含其它类对象的类,称为组合类。创建组合类的对象时,将按内嵌对在类中声明的先后顺序调用其相应构造函数,最后调用该组合类的构造函数。而析构函数的调用顺序相反。 7.用对象的引用作函数参数,对函数内部对象的改变将影响实参对象。使用对象的引用,关键是建立引用。对象数组,即所有数组元素都是某个类的对象。对象指针即指向对象的指针。用对象数组访问成员的方式是:对象数组名下标.成员名,用对象指针访问成员的方式是:对象指针名-成员名。 8. 友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。类的友元可以是函数,也可以是类。若是函数,则该函数叫友元函数;若是类

温馨提示

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

评论

0/150

提交评论