[IT认证]第3章关于类和对象的进一步讨论-2.ppt

上传人:音乐台 文档编号:1995468 上传时间:2019-01-29 格式:PPT 页数:35 大小:409.23KB
返回 下载 相关 举报
[IT认证]第3章关于类和对象的进一步讨论-2.ppt_第1页
第1页 / 共35页
[IT认证]第3章关于类和对象的进一步讨论-2.ppt_第2页
第2页 / 共35页
[IT认证]第3章关于类和对象的进一步讨论-2.ppt_第3页
第3页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[IT认证]第3章关于类和对象的进一步讨论-2.ppt》由会员分享,可在线阅读,更多相关《[IT认证]第3章关于类和对象的进一步讨论-2.ppt(35页珍藏版)》请在三一文库上搜索。

1、第3章 关于类和对象的进一步讨论 3.6共用数据的保护 3.9静态成员 3.10友元,3.6共用数据的保护,const对象 定义形式 类名 const 对象名 const 类名 对象名 不能改变const对象的成员数据 const对象只能访问对象中的const成员函数 必须对const对象进行初始化,class A int a; public: int b; A(int i, int j) a=i; b=j; void set(int i, int j); void print() const coutab; ; int main() const A x(2,3); x.b=4; /错误 x.

2、print; /正确 ,const成员函数,定义形式 (参数表) const 不能改变类中成员数据的值,也不能调用非const成员函数 const对象只能调用const成员函数 普通对象优先考虑非const成员函数,class A int a; public: int b; A(int i, int j) a=i; b=j; void set(int i, int j); void print() const coutabn; ; int main() const A x(2,3); x.b=4; /错误 x.print; /正确 ,const成员数据,定义形式 const 变量名 不能在类定

3、义时直接赋值 不能在任何函数中对其赋值 构造函数只能够通过初始化列表对其初始化 类构造函数:常变量名(值) ,class C int count; const int increment; public: C( int c=0, int i=1); void set() const; ; C:C(int c=0, int i=1):increment(i) /正确 count =c; increment=i; /错误 ,指向对象的常指针,定义形式 类名 *const 指针变量名 = 对象地址 Time * const p= 声明时初始化,指针值不能改变 可以改变所指对象的值,问题:指出程序的错

4、误 Time t1, t2; int i; Time * const p=,Time t1, t2; int i; Time * const p= /错误,指向常对象的指针,定义形式 const 类名 * 指针变量名 const Time t1; const Time *p; p= 如果变量是常变量,只能用指向常变量的指针指向它 如果变量不是常变量,也可以用指向常变量的指针指向它,但不可以通过指针改变所指对象的值,问题:指出程序的错误 const Time t1, t2; const Time *p=,指向常对象的指针,const Time t1, t2; const Time *p= /错误

5、,3.10 友元,友元函数 定义形式 friend 友元函数名(参数表) 不是类的成员函数,但可以访问类所有的成员 可以在类的任何部分声明 实现可以在类外(不需要加上:), 也可以在类内,class CA int a; public: friend void A(); ; class CB int b; public: friend void A(); ; void A() CA a1; CB b1; a1.a=1; b1.b=2; ,定义形式 friend 类名:成员函数名(参数表) class CA public: void A(); class CB public: friend voi

6、d CA:A(); void CA:A() 直接访问CA类和CB类的所有成员,友元成员函数,class CA public: void A(); void B(); ; class CB public: friend class CA; void CA:A() 直接访问CA类和CB类的所有成员 void CA:B() 直接访问CA类和CB类的所有成员,友元类,通常,每当说明一个对象时,把该类中的有关成员数据拷贝到该对象中,即同一类的不同对象,其成员数据之间是互相独立的。,3.9 静态成员,class A int x,y; public: void Setxy(int a, int b) x=a

7、; y=b; ; A a1, a2;,a1.x,a1.y,a2.x,a2.y,a1. Setxy(),a2. Setxy(),a1.Setxy(1,2); a2.Setxy(3,4);,this-x=a;,this-y=b;,当我们将类的某一个数据成员的存储类型指定为静态类型时,则该类所有对象其静态成员均共享一个存储空间,这个空间是在编译的时候分配的。 在类定义中,用关键字static修饰的数据成员称为静态数据成员。,class A int x,y; static int z; public: void Setxy(int a, int b) x=a; y=b; ; A a1, a2;,z,a

8、1. z,a2. z,不同对象,同一空间,通过静态数据成员名前加上类名和作用域运算符,可直接引用静态数据成员。 静态变量缺省的初值为0,所以静态数据成员总有唯一的初值。在类体外可以对静态数据成员指定一个初值。,class A int i,j; public: static int x,y;/定义静态成员 A(int a=0,int b=0,int c=0, int d=0) i=a;j=b;x=c;y=d; void Show()cout “i=“it“j=“jt; cout “x=“xt“y=“y“n“; ; int A:x=0; int A:y=0; void main(void ) A

9、a(2,3,4,5); a.Show(); A b(100,200,300,400); b.Show(); a.Show(); ,a.x 和b.x在内存中占据一个空间 a.y 和b.y在内存中占据一个空间,i=2 j=3 x=4 y=5,i=100 j=200 x=300 y=400,i=2 j=3 x=300 y=400,class A int i,j; public: static int x; public: A(int a=0,int b=0,int c=0) i=a ; j=b ; x=c; void Show() cout “i=“it“j=“jt; cout “x=“x“n“;

10、; int A:x=500; /int A:x void main(void ) A a(20,40,10),b(30,50,100); a.Show (); b.Show (); cout “A:x=”A:xn; /可以直接用类名引用 ,只能在类外初始化,问题:写出程序输出 class A int i; static int count; public: A(int a=0) i=a; count+; cout “Number of Objects=“countn; A() count-; cout “Number of Objects=“countn; void Show() cout “

11、i=“in; cout “count=“count“n“; ; int A:count=0; void main(void ) A a1(100); A b2; a1.Show(); ,class A int i; static int count; public: A(int a=0) i=a; count+; cout “Number of Objects=“countn; A() count-; cout “Number of Objects=“countn; void Show() cout “i=“in; cout “count=“count“n“; ; int A:count=0;

12、 void main(void ) A a1(100); A b2; a1.Show(); ,Number of Objects=1,Number of Objects=2,Number of Objects=3,i=100 count=3,Number of Objects=2,Number of Objects=1,Number of Objects=0,静态成员函数 可以将类的成员函数定义为静态的成员函数。用关键字static来修饰成员函数 。,class A float x, y; public : A( ) static void sum(void) . ;,对静态成员函数的用法说明

13、 在类外的程序代码中,通过类名加上作用域操作符:,可直接调用静态成员函数。 静态成员函数只能直接使用本类的静态数据成员或静态成员函数。这是因为静态成员函数不包含对象地址的this指针。 静态成员函数的实现部分在类定义之外定义时,其前面不能加修饰词static。,问题:写出程序输出 class Obj static int i; public: Obj()i+; Obj()i-; static int getVal() return i; ; int Obj:i=0; void f () Obj ob2;coutgetVal(); delete ob3; coutObj:getVal(); re

14、turn0; ,问题:写出程序输出 class Obj static int i; public: Obj()i+; Obj()i-; static int getVal() return i; ; int Obj:i=0; void f () Obj ob2;coutgetVal(); delete ob3; coutObj:getVal(); return0; 232,思考:如何利用静态成员函数访问非静态数据成员? 问题:写出下面程序的输出 class Tc private:int A; static int B; public:Tc(int a)A=a; B+=a; static voi

15、d display(Tc c) cout“A=“c.A“,B=“Bendl; ; int Tc:B=2; void main(void) Tc a(2),b(4); Tc:display (a); Tc:display (b); ,class Tc private:int A; static int B;/静态数据成员 public:Tc(int a)A=a; B+=a; static void display(Tc c)/Tc的对象为形参 cout“A=“c.A“,B=“Bendl; ; int Tc:B=2; void main(void) Tc a(2),b(4); Tc:display

16、 (a); Tc:display (b); ,非静态成员,用对象名来引用,静态成员,直接引用,直接用类名来调用静态成员函数,A=2,B=8,A=4,B=8,类静态成员,设计score类,统计一个班学生信息 利用totals存储学生成绩 利用 re_totals返回成绩,class CStudent private:int num; char name20; double score; static double totals; public: CStudent(int n,char *sname,double s) static double re_totals() return totals

17、; ;,prev,next,back,double CStudent:totals= ? ; CStudent:CStudent(int n,char *sname,double s) ? ; num=n; strcpy(name,sname); score=s; void main() int num,id;char name20;double score; coutnum; for (int i=0;iid; coutname; coutscore; CStudent stu(id,name,score); cout“The total score is:“CStudent:re_tota

18、ls()endl; ,prev,next,back,double CStudent:totals= 0.0; CStudent:CStudent(int n,char *sname,double s) totals+=s; num=n; strcpy(name,sname); score=s; void main() int num,id;char name20;double score; coutnum; for (int i=0;iid; coutname; coutscore; CStudent stu(id,name,score); cout“The total score is:“CStudent:re_totals()endl; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1