进一步使用成员函数.PPT

上传人:国*** 文档编号:388793 上传时间:2018-09-30 格式:PPT 页数:47 大小:303.50KB
下载 相关 举报
进一步使用成员函数.PPT_第1页
第1页 / 共47页
进一步使用成员函数.PPT_第2页
第2页 / 共47页
进一步使用成员函数.PPT_第3页
第3页 / 共47页
进一步使用成员函数.PPT_第4页
第4页 / 共47页
进一步使用成员函数.PPT_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、第六章进一步使用成员函数,静态成员友元函数const对象和volatile对象转换函数指向类成员的指针数组和类,静态成员,静态成员:使用关键字static修饰的类的数据成员和成员函数格式:static 数据类型 数据成员名;举例:class MyClass public: static int count; /引用性说明 static void func(); int x; ;,无论建立多少个类的对象,都只有一个静态数据的拷贝,对多个对象来说,静态数据成员只存储在一个地方,静态数据成员的值对每个对象都一样。如果在某个对象中对静态成员的值进行了更新,则所有对象都存取到更新后的相同的值。例:Tes

2、t b,c; b.x=25; cout静态成员名,小结:一般统计总数、平均数用静态成员,应用举例,class Myclassint i;static int j;public:Myclass();void Print();Myclass();int Myclass:j=0;Myclass:Myclass()j+=10;void Myclass:Print() coutj;void main() Myclass first,second; first.Print(); second.Print();,class CStatic public:CStatic()val+;static int va

3、l;int CStatic:val=0;void main() cout “CStatic:val=”CStatic:valendl; CStatic cs1; cout “cs1.val=”cs1.valendl; CStatic cs2; cout “cs2.val=”cs2.valendl; CStatic cs3,cs4; cout “cs1.val=”cs1.valendl; cout “cs2.val=”cs2.valmember_int=i;void main()X obj; X:func(1,静态成员函数,静态成员函数,无论是公有派生和私有派生,派生类都可以使用基类的静态成员,

4、使用时唯一的要求是,必须用“类名:成员名”代表这个静态成员。class Base public: static void a(); void b();class Derived:private Base;class DD:public Derivedvoid func();void DD:func() Base:a(); a(); b();,例题分析,找出程序中的错误class MyClasspublic: static void f();private: static int Globe;void MyClass:f() Globe=100;,没有为静态成员变量初始化,例题分析,找出程序中的

5、错误class MyClasspublic: static void f(MyClass my);private: int Globe;void MyClass:f() coutGlobe;,成员函数f的定义与实现的接口不一致成员函数的实现中对私有成员Globe的引用不正确,对对象的引用采用间接方式。,友元函数,设向量类Vector和矩阵类Matrix,向量和矩阵元素都是float类型。在类中各自说明一个公有成员函数elem,用于存取向量和矩阵的私有数据元素Vi和Mijfloat ,友元函数:不是当前类的成员函数,而是独立于当前类的外部函数,但它可访问该类的所有对象的成员。,友元函数,clas

6、s girlchar *name;int age;public: girl(char *n,int d) name=new charstrlen(n)+1;strcpy(name,n);age=d; friend void disp(girl ,friend 函数名 例:friend void disp(girl &)友元函数带有一个该类的入口参数 例:void disp(girl &)访问类的对象的成员时,必须使用对象名不必在函数名前加“类名:”,友元可以是不属于任何类的一般函数友元可以是整个的一个类,友元函数,class two;class oneint a;public:void f(t

7、wo ,友元函数,友元可以是另一个类的成员函数,可以把类声明成另一个类的友元,友元函数,class C2friend class C1;,友元不具有传递性。例如:X是Y的友元,Y是Z的友元友元不具有交换性。例如:X是Y的友元,友元和派生类,派生类的友元可以访问基类的公有和保护成员。当友元访问基类的静态保护成员时,不能使用成员名限定方法。,class oneprotected:int a;public:one()a=20;class two:public oneint b;friend void f(two ,友元类的派生类可以访问基类的公有和保护成员,基类必须是派生类的直接基类。因为友元不能继

8、承,class oneprotected:int a;public:friend class two;class twopublic: void func(one ,友元和派生类,例题分析,找出程序中的错误class MyClass char my_char1; char my_char2;public: friend void SetMember(MyClass ,const对象,const对象:在对象前面加上关键字const。该对象的任何数据成员都不能被修改const Date MyBirthday(8,13,1970);const写在成员函数的参数表后面,该成员函数为只读函数。注意只读成

9、员函数不仅在类定义体内说明时需要使用关键字const,在类定义体外定义时也必须使用关键字const。int GetMonth() constreturn month;一个const对象只能访问const成员函数。不能使用const对象调用非const的普通成员函数,volatile对象,volatile对象:在对象前面加上关键字volatile。volatile变量是程序设计的进程可以随时改变的变量。例如:时钟。一个volatile对象只能访问volatile成员函数。,使用带有this指针的成员函数,将关键字const写在函数头后,函数体前,说明函数是一个const成员函数,这时const不

10、是指函数的返回值,而是指函数体中使用的this指针。,class ConstFunint val;public:ConstFun(int i)val=i;int Getval() const;int ConstFun:GetVal() constreturn val;void main() ConstFun s(98); couts.Getval()endl;,const ConstFun * const this;,转换函数,转换函数:类中定义的一个成员函数,形式为:class A operator type( );,说明:type是类型名(或类名),或由类型名与类型修饰符*(指针)、 (数

11、组)和( )以及const或volatile等组成的表达式。该函数不能带有参数,也不能指定返回类型,其返回类型是type当A类的对象作为操作数用在表达式中,该表达式要求操作数应具有type类型时,该转换函数被自动调用,进行类型转换、将类的数据成员类型转换为type类型。,转换函数,例:class number int val; public: number(int i)val=i; operator int( ); number:operator int( ) return val;void main() number n(15); int i=n; coutiendl; i=i+n; cou

12、tiendl; coutint(n)endl;(coutnendl;),被解释为i=n.operator int( );,表达式中出现n,自动调用operator int(),转换函数,转换函数可以被派生类继承,class num:public number public: num(int i):number(i) ;void main( ) num n(15); int i=n; couti+nendl;,转换函数,转换函数可以被说明成虚函数,class A public: virtual operator const char *( )return “A”;class B:public A

13、 public: virtual operator const char *( )return “B”;void main() A *p=new B; cout*pendl;,看到指针表达式,就会自动调用类型为指针类型的类型转换函数,*”。,指向类数据成员的指针,例:class A public: int a,b,c; void fa(void) void fb(void) ; void main( ) int A:*p; p=,.*运算符的左操作数必须是类的对象-*的左操作数是指向类的对象的指针,指向成员函数的指针,void (A:*pfan)(void);,定义一个变量pfan,指向任何无

14、参数和无返回值的A成员函数,pfan=A:fa; 指向类A成员函数fa()的指针pfan,将该函数的地址置给指针pfanA x;A *px=new A;(x.*pfan)(); 指向类A的对象x的成员函数fa(px-*pfan)(); 指向类A对象指针的成员函数fa,type (X:pointer)(list);,指向X类中参数类型列表为list,返回类型为type的成员函数的指针,指向成员函数的指针,#include class A private: int val; public: A(int i)val=i; int value(int a)return val+a;void main(

15、) int(A: *pfun)(int); pfun=A:value; A obj(10); cout*pfun)(15)endl;,指向成员函数的指针,指向类成员的指针指向一个虚函数,并且通过指向对象的指针(或引用)访问该虚函数,发生多态性。,#include class base public: virtual void print()cout*pf)();void main() derived d; display(,base:此处的:不是成员名限定,而是指向类的成员函数的指针的一种表示方法。可以读作pf是指向base类的无参数无返回类型的成员函数。如果该成员函数是虚函数,则该指针指向基

16、类还是派生类的同名成员函数由运行时动态决定。,指向类的静态成员的指针,#include class A public: static int num;int A:num;void main() int *p=,静态成员不需要对象,数组和类,类对象数组类对象指针数组对象数据成员数组类对象数据成员指针数组类成员函数指针数组静态数据成员指针数组,类对象数组,每一数组元素都是对象的数组,如果类中含有用户定义的构造函数,且构造函数带有参数, 则定义对象数组时,可通过初始值表进行赋值,#include class examint x;public:exam(int n)x=n;int get_x()ret

17、urn x;main()exam ob4=11,22,33,44;int i;for(i=0;i4;i+)coutobi.get_x() ;coutn;return 0;,类对象数组,如果类中含有构造函数,则定义对象数组时,也可通过不带参数的构造函数或带有缺省参数的构造函数给对象数组元素赋值,class point int x,y;public: point() x=5;y=5; point(int a,int b) x=a;y=b; point(int a) x=a; int get_x() return x; int get_y() return y;void main() point o

18、p(3,4); point op13=1,4; point op24=point(2,3),point(3,4);,类对象数组,完成初始化工作的构造函数不同,说明对象数组的格式有差别使用缺省构造函数(无参数或全部参数采用缺省值)完成初始化工作,使得组成数组的每个对象都具有相同的初始状态 类名 数组名数组长度;使用带参数构造函数初始化数组:必须在说明对象数组的同时给出初值表类名 数组名长度=(初值1),(初值2); 注意:在初值表中没有对全部的数据成员初始化,则必须定义缺省构造函数,析构函数和对象数组,当对象数组的生命期结束之后,C+系统为对象数组的每个元素调用一次析构函数。,#include

19、class test int num;public: test()num=0; test(int n)num=n; test()coutDestructorshow_a(); return 0;,类对象数组,例题分析,class baseint x,y;public:base(int m,int n)x=m;y=n;void print();void print() const;void base:print()coutx,yendl;void base:print() constcoutx,y constendl;void main()base a(55,84); a.print(); co

20、nst base b(32,25); b.print();,55,8432,25 const,例题分析,class baseconst int a;static const int b;public:base(int i);void print();const int ,常量对象的初始化,125,128,125119,128,119,class testint n;public:test(int i)n=i;coutconstructor is called.endl;test()coutdestructor is called.endl;int getn()return n;void inc

21、()+n;void main() static test a(3); /静态类对象 for(int i=0;i3;i+) a.inc(); couta.getn()endl; coutExit main()endl;,例题分析,Constructor is called456Exit main()Destructor is called,例题分析,class testprivate:int n;public:test(int i)n=i;coutconstructor is called.endl;test()coutdestructor is called.endl;int getn()re

22、turn n;void inc()+n;void main() for(int i=0;i3;i+) static test a(3);a.inc(); couta.getn()endl; coutExit main()endl;,静态类对象的构造(析构)函数构造函数在代码执行过程中,第一次遇到它的变量定义时被调用,但直到整个程序结束之前仅调用一次。析构函数在整个程序退出前被调用,调用一次。,Constructor is called456Exit main()Destructor is called,例题分析,class testprivate:int n;public:test(int i

23、)n=i;coutconstructor is called.endl;test()coutdestructor is called.endl;int getn()return n;void inc()+n;void main() for(int i=0;i3;i+) test a(3);a.inc(); couta.getn()endl; coutExit main()endl;,a定义在for语句中是局部对象,只能存在循环体内,结束循环体本次循环时,需要调用一次析构函数。,constructor is called.4destructor is called.constructor is called.4destructor is called.constructor is called.4destructor is called.Exit main()Press any key to continue,

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

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。