C面向对象程序设计 第四章 类与对象(二)_第1页
C面向对象程序设计 第四章 类与对象(二)_第2页
C面向对象程序设计 第四章 类与对象(二)_第3页
C面向对象程序设计 第四章 类与对象(二)_第4页
C面向对象程序设计 第四章 类与对象(二)_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

1、1C+面向对象程序设计面向对象程序设计第第4章章 类和对象(二)类和对象(二) 2C+面向对象程序设计面向对象程序设计4.1 自引用指针自引用指针this 例例 4.1 this指针的引例。指针的引例。 #include class A public: A(int x1) x=x1; void disp() coutx= xendl; private: int x; ; main() A a(1),b(2); cout a: ; a.disp(); cout b: ; b.disp(); return 0; a.disp()与与b.disp()在存储在存储时是同一个函数,它怎么时是同一个函数,

2、它怎么区分是区分是a调用还是调用还是b调用它调用它呢?呢?3C+面向对象程序设计面向对象程序设计1什么是this指针 4C+面向对象程序设计面向对象程序设计例例4.2 显示显示this指针的值。指针的值。#includeclass A public: A(int x1) x=x1; void disp( ) coutnthis=thiswhen x=x; private: int x;main() A a(1),b(2),c(3); a.disp(); b.disp(); c.disp(); return 0; 5C+面向对象程序设计面向对象程序设计为了帮助大家更深一步了解this指针是如何在

3、“幕后”工作的,我们再看一个例子。假设有一段程序如下:class abc private: char a; int b;public: void init(char ma,int mb) a=ma;b=mb;main( )abs ob;ob.init(x,12);return 0;6C+面向对象程序设计面向对象程序设计 ob.init(x,12); 那么C+如何使用this指针指向对象ob呢?实际上,C+在编译过程中做些了简单的工作,将上述调用init( )函数的语句转换成如下形式: init(&ob,x,12); 换句话说, C+把类对象作为参数传递给函数(传地址)。虽然程序中的成员

4、函数init( )没有对应的形参,但程序编译时C+将其转换成以下形式: void init(abc *this,char ma,int mb) this-a=ma;this-b=mb; 由于函数调用时,第一个参数是按照地址传递的,因此当对象ob调用函数init()时,this指针便指向ob,于是隐式指针this保证了成员函数init( )的操作对象确实是对象ob。7C+面向对象程序设计面向对象程序设计何时显式使用this指针? (1)当需要在一个成员函数内标识被该成员函数操作的对象时,就需要显式使用this指针。8C+面向对象程序设计面向对象程序设计#include class Sample

5、int x,y; public: Sample(int i=0,int j=0) x=i; y=j; void copy(Sample &xy); void print() coutx“,”yendl; ;void Sample:copy(Sample &xy) if(this=&xy) return; /通过判断,避免不必要的复制 *this=xy; main() Sample p1,p2(5,6); p1.copy(p2); p1.print();9C+面向对象程序设计面向对象程序设计(2)当成员函数的形参名与该类的数据成员同名时,必须用this指针来显式区分。#i

6、nclude class sam int a, b;public: sam(int a,int b) this-a=a;this-b=b;coutaendl; void print() couta= a b= bendl;main() sam s2(2,2);s2.print();return 0; 10C+面向对象程序设计面向对象程序设计this指针的另外一个作用:获取对象自身。因为this指针的值是对象自身的首地址,*this 是指针所指向的对象,即当前对象。如果一个类的成员函数返回值是*this,程序就可以用这个返回值去调用另外一个成员函数。11C+面向对象程序设计面向对象程序设计【举例

7、】#include class Classroom public: Classroom(int n=100,double l=8.0,double w=6.0); Classroom & set(int n,double l,double w); void print();private:int seats;double length,width;12C+面向对象程序设计面向对象程序设计Classroom:Classroom(int n,double l,double w)seats=n0 ? n:100;length=l0? l:8.0;width=w0?w:6.0;Classroo

8、m & Classroom:set(int n,double l,double w)seats=n0 ?n:100;length=l0? l:8.0;width=w0?w:6.0;return *this;13C+面向对象程序设计面向对象程序设计void Classroom:print() coutwidth meters width and length meters length, contains seats seats. endl;main()Classroom a101(80,6,4);coutClassroom a101 is ;a101.print();coutset a

9、nd print:endl;coutClassroom a101 is ;a101.set(90,7.0,5.0).print(); return 0; 14C+面向对象程序设计面向对象程序设计this指针指针是一个const指针,不能在程序中修改它和给它赋值是一个局部数据,它的作用域仅在一个对象内部在系统中隐含存在。一般不必特别地去使用它。15C+面向对象程序设计面向对象程序设计4.2 对象数组与对象指针 4.2.1 对象数组对象数组 所谓对象数组是指每一数组元素都是对象的数组。 定义一个一维数组的格式如下: 类名 数组名下标表达式; 16C+面向对象程序设计面向对象程序设计 例例4.4 对

10、象数组的应用。对象数组的应用。#includeclass exam public: void set_x(int n) x=n; int get_x() return x; private: int x; int main() exam ob4; int i; for (i=0;i4;i+) obi.set_x(i); for (i=0;i4;i+) coutobi.get_x() ; cout”操作符。 20C+面向对象程序设计面向对象程序设计 例例4.7对象指针的使用。对象指针的使用。 #include class exe public: void set_a(int a) x=a; vo

11、id show_a() coutxshow_a(); / 利用对象指针访问对象的成员 return 0; 21C+面向对象程序设计面向对象程序设计2. 用对象指针访问对象数组 例如将例4.7的main()改写为: main() exe ob2,*p; ob0.set_a(10); ob1.set_a(20); p=ob; p-show_a(); p+; p-show_a(); return 0; 22C+面向对象程序设计面向对象程序设计4.3 向函数传递对象 本节内容中,把对象当作普通变量理解就行了本节内容中,把对象当作普通变量理解就行了4.3.1 使用使用对象对象作为函数参数作为函数参数-值

12、传递值传递 4.3.2 使用使用对象指针对象指针作为函数参数作为函数参数-地址传递地址传递4.3.3 使用使用对象的引用对象的引用作为函数参数作为函数参数-形参值的改变就是形参值的改变就是改变实参值改变实参值 23C+面向对象程序设计面向对象程序设计例例4.11 使用对象作为函数参数。使用对象作为函数参数。#includeclass aClass public: aClass(int n) i=n; void set(int n) i=n; int get( ) return i; private: int i; ;void sqr(aClass ob) ob.set(ob.get()*ob.

13、get(); coutcopy of obj has i value of ; coutob.get()n; main() aClass obj(10); sqr(obj); coutobj.i is unchanged in main:; coutobj.get( )endl; return 0; 24C+面向对象程序设计面向对象程序设计【例】对象指针作函数参数示例。 # #include iostreaminclude .h class M class M public: public: M( ) x=y=0; M( ) x=y=0; M(int i,int M(int i,int j)

14、j) x=i;y=j; x=i;y=j; void copy(M *m); void setxy(int i,int j) x=i;y=j; void print( ) coutx“,”yx; y=m-y; void fun(M m1,M *m2); /一般函数说明一般函数说明 main( ) M p(5,7),q; /定义对象定义对象 q.copy(&p); fun(p,&q); p.print( ); q.print( ); 以p对象的地址为实参26C+面向对象程序设计面向对象程序设计 void fun(M m1,M *m2) /一般函数定义一般函数定义 m1.setxy(

15、12,15); m2-setxy(22,25); 实参形参 形参pqm1m2 实参5 70 05 720082008过程调用中5 7200820085 75 75 722 25过程调用后27C+面向对象程序设计面向对象程序设计例例4.12 使用对象指针作为函数参数。使用对象指针作为函数参数。#includeclass aClass public: aClass(int n) i=n; void set(int n) i=n; int get( ) return i; private: int i; ;void sqr(aClass *ob) ob-set(ob-get() * ob-get()

16、; coutCopy of obj has i value of ; coutget()n; main() aClass obj(10); sqr(&obj); coutobj.i in main has been changed :; coutobj.get() n; return 0; 28C+面向对象程序设计面向对象程序设计例例4.13使用对象引用作为函数参数。使用对象引用作为函数参数。#includeclass aClass public: aClass(int n) i=n; void set(int n) i=n; int get( ) return i; private:

17、 int i; ;void sqr(aClass& ob) ob.set(ob.get() * ob.get(); coutCopy of obj has i value of ; coutob.get()n; main() aClass obj(10); sqr(obj); coutobj.i in main() has been changed :; coutobj.get() n; return 0; 29C+面向对象程序设计面向对象程序设计例例#include class M public: M( ) x=y=0; M(int I,int j) x=I;y=j; void co

18、py(M &m); void setxy(int i,int j) x=I;j=j; void print( )coutx“,”yendl; private: int x,y; ;30C+面向对象程序设计面向对象程序设计void M:copy(M &m) /成员函数定义成员函数定义 x=m.x; y=m.y; void fun(M m1,M &m2); /一般函数说明一般函数说明void main( ) M p(5,7),q; /定义对象定义对象 q.copy(p); fun(p, q); p.print( ); q.print( ); void fun(M m1,M

19、&m2) /一般函数定义一般函数定义 m1.setxy(12,15); m2.setxy(22,25); 31C+面向对象程序设计面向对象程序设计实参形参 形参pqm1m2 实参5 70 05 7过程调用中5 75 75 75 722 25过程调用后32C+面向对象程序设计面向对象程序设计4.4 静态成员 4.4.1 静态数据成员静态数据成员 在一个类中在一个类中,若将一个数据成员说明为若将一个数据成员说明为static,这种成员称为静态数据成员。这种成员称为静态数据成员。 与一般的数据成员不同与一般的数据成员不同,无论建立多少个无论建立多少个类的对象类的对象,都只有一个静态数据的拷贝

20、。从而都只有一个静态数据的拷贝。从而实现了同一个类的不同对象之间的数据共享实现了同一个类的不同对象之间的数据共享。 定义静态数据成员的格式如下定义静态数据成员的格式如下: static 数据类型数据类型 数据成员名数据成员名; 33C+面向对象程序设计面向对象程序设计例例4.15静态数据成员的使用引例。静态数据成员的使用引例。#include#includeclass Student public: Student(char *name1,char *stu_no1,float score1); Student(); void show(); / 输出姓名、学号和成绩输出姓名、学号和成绩 vo

21、id show_count_sum_ave(); /输出人数、总成绩和平均成绩输出人数、总成绩和平均成绩 private: char *name; / 学生姓名学生姓名 char *stu_no; / 学生学号学生学号 float score; / 学生成绩学生成绩 static int count; / 统计学生人数统计学生人数 static float sum; / 统计总成绩统计总成绩 static float ave; / 统计平均成绩统计平均成绩;34C+面向对象程序设计面向对象程序设计Student:Student(char *name1,char *stu_no1,float s

22、core1 ) name=new charstrlen(name1)+1; strcpy(name,name1); stu_no=new charstrlen(stu_no1)+1; strcpy(stu_no,stu_no1); score=score1; +count; / 累加学生人数累加学生人数 sum=sum+score; / 累加总成绩累加总成绩 ave=sum/count; / 计算平均成绩计算平均成绩 Student:Student() delete name; delete stu_no; -count; sum=sum-score; 35C+面向对象程序设计面向对象程序设计

23、void Student:show() coutn name: name; coutn stu_no: stu_no; coutn score: score; void Student:show_count_sum_ave() coutn count: count; / 输出静态数据成员输出静态数据成员count coutn sum: sum; / 输出静态数据成员输出静态数据成员sum coutn ave: ave; / 输出静态数据成员输出静态数据成员aveint Student:count=0; / 静态数员静态数员count初始化初始化float Student:sum=0.0; /

24、静态数员静态数员sum初始化初始化float Student:ave=0.0; / 静态数员静态数员ave初始化初始化36C+面向对象程序设计面向对象程序设计void main() Student stu1(Liming,990201,90); stu1.show(); stu1.show_count_sum_ave(); Student stu2(Zhanghao,990202,85); stu2.show(); stu2.show_count_sum_ave(); 1、静态变量属于类,为类创建的所有对象所公用。、静态变量属于类,为类创建的所有对象所公用。2、类中的非静态变量,在类创建对象时

25、,不同的对、类中的非静态变量,在类创建对象时,不同的对象拥有各自的变量存储空间。象拥有各自的变量存储空间。3、静态变量可以实现同一类中不同对象间的数据共、静态变量可以实现同一类中不同对象间的数据共享。享。37C+面向对象程序设计面向对象程序设计有关静态成员变量的语法规定静态成员变量要用静态成员变量要用static声明。声明。静态成员变量的初始化要在类外单独进行,而且要在对象定义之前,静态成员变量的初始化要在类外单独进行,而且要在对象定义之前,一般在类定义之后、一般在类定义之后、main()之前初始化。之前初始化。 初始化的格式:初始化的格式: 数据类型数据类型 类名类名:静态数据成员名静态数据

26、成员名=值值; 如如 int Student:count=0; 注意:初始化时数据成员名前面不加注意:初始化时数据成员名前面不加static。静态成员变量属于类,公有的静态成员变量可以用静态成员变量属于类,公有的静态成员变量可以用 类名类名:静态数成静态数成员名员名 的方式在类外直接调用。(也可通过的方式在类外直接调用。(也可通过对象对象调用,私有的静态成调用,私有的静态成员变量不能在类外调用。)员变量不能在类外调用。)与普通静态变量一样,在编译时创建并初始化。在该类的任何对象与普通静态变量一样,在编译时创建并初始化。在该类的任何对象被建立之前就已经存在。被建立之前就已经存在。静态成员变量实际

27、代替了全局变量的作用。静态成员变量实际代替了全局变量的作用。38C+面向对象程序设计面向对象程序设计例4.16公有静态数据成员的访问。#include class myclasspublic:static int i;int geti()return i;int myclass:i=0;main()myclass:i=200;myclass ob1,ob2;coutob1.i=ob1.geti()endl;coutob2.i=ob2.geti()endl;ob1.i=300;coutob1.i=ob1.geti()endl;coutob2.i=ob2.geti()endl;return 0;3

28、9C+面向对象程序设计面向对象程序设计4.17静态数据成员和一般数据成员的不同。#include class Studentpublic:Student()+count;StudentNo=count; void print()coutstudentStudentNo ;coutcount=countendl;private:static int count;int StudentNo; ;int Student:count=0;main() Student student1; student1.print(); cout-静态成员函数名静态成员函数名(实参表实参表)41C+面向对象程序设计面

29、向对象程序设计例例4.18静态成员函数来访问静态数据成员。静态成员函数来访问静态数据成员。#include#includeclass Student private: char *name; / 学生姓名学生姓名 char *stu_no; / 学生学号学生学号float score; / 学生成绩学生成绩static int count; / 静态数据成员静态数据成员,统计学生人数统计学生人数 static float sum; / 静态数据成员静态数据成员,统计总成绩统计总成绩 public: Student(char *name1,char *stu_no1,float score1);

30、 Student(); void show(); / 普通成员函数普通成员函数,输出姓名、学号和成绩输出姓名、学号和成绩static void show_count_sum(); / 静态成员函数静态成员函数, 输出学生人数和总成绩输出学生人数和总成绩;42C+面向对象程序设计面向对象程序设计Student:Student(char *name1,char *stu_no1,float score1 ) name=new charstrlen(name1)+1; strcpy(name,name1); stu_no=new charstrlen(stu_no1)+1; strcpy(stu_n

31、o,stu_no1); score=score1; +count; / 累加学生人数累加学生人数 sum=sum+score; / 累加总成绩累加总成绩 Student:Student() delete name; delete stu_no; -count; sum=sum-score; 43C+面向对象程序设计面向对象程序设计void Student:show() coutn name: name; coutn stu_no: stu_no; coutn score: score;void Student:show_count_sum() / 静态成员函数静态成员函数 coutn coun

32、t: count; / 输出静态数据成员输出静态数据成员 coutn sum: sum; / 输出静态数据成员输出静态数据成员int Student:count=0; / 静态数据成员初始化静态数据成员初始化float Student:sum=0.0; / 静态数据成员初始化静态数据成员初始化44C+面向对象程序设计面向对象程序设计void main() Student stu1(Liming,990201,90); stu1.show(); Student:show_count_sum(); / 使用类名访问使用类名访问 静态成员函数静态成员函数 Student stu2(Zhanghao,

33、990202,85); stu2.show(); stu2.show_count_sum(); / 使用对象使用对象stu2访问访问 静态成员函数静态成员函数 45C+面向对象程序设计面向对象程序设计 有关静态成员函数可以定义成内嵌的,也可类外定义,类外定义时可以定义成内嵌的,也可类外定义,类外定义时不要不要static。一般用来访问全局变量或同一类中的静态变量。一般用来访问全局变量或同一类中的静态变量。私有静态成员函数不能被类外部函数和对象访问私有静态成员函数不能被类外部函数和对象访问使用静态成员函数可以在创建对象之前处理静态使用静态成员函数可以在创建对象之前处理静态数据成员,这是普通函数所

34、不能实现的功能。数据成员,这是普通函数所不能实现的功能。静态成员函数没有静态成员函数没有this指针。一般不访问类中的非指针。一般不访问类中的非静态成员静态成员(变量、函数变量、函数),访问时,要把对象作为参,访问时,要把对象作为参数传递。数传递。46C+面向对象程序设计面向对象程序设计例4.19静态成员函数访问非静态数据成员。#include class small_catpublic: small_cat(double w) weight=w; total_weight+=w; total_number+; static void display(small_cat & w) co

35、utThe small_cat weights w.weightkgn; static void total_disp() couttotal_number small_cat total weight; couttotal_weight kg endl;private:double weight;static double total_weight;static double total_number;47C+面向对象程序设计面向对象程序设计double small_cat:total_weight=0;double small_cat:total_number=0;main()small_

36、cat w1(0.9),w2(0.8),w3(0.7);small_cat:display(w1); small_cat:display(w2);w1.display(w3);w3.total_disp();return 0;48C+面向对象程序设计面向对象程序设计4.5 友 元 友元既可以是不属于任何类的一般函数友元既可以是不属于任何类的一般函数,也可以是另一个类的成员函数也可以是另一个类的成员函数,还可以是整个还可以是整个的类。的类。 49C+面向对象程序设计面向对象程序设计4.5.1 友元函数 友元函数不是当前类的成员函数友元函数不是当前类的成员函数,而是独立于而是独立于当前类的外部函数

37、当前类的外部函数,但它可以访问该类的所有对象的但它可以访问该类的所有对象的成员成员,包括私有成员、保护成员和公有成员。包括私有成员、保护成员和公有成员。1.将非成员函数声明为友元函数将非成员函数声明为友元函数 50C+面向对象程序设计面向对象程序设计例例4.22 友元函数的使用。友元函数的使用。#include#includeclass girl public: girl(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; girl() delete name; friend void disp(girl &)

38、; /声明友元函数声明友元函数 private: char *name; int age; ; void disp(girl &x) /定义友元函数定义友元函数 coutGirls name is ,age:x.agen; void main() girl e(Chen Xinwei,18); disp(e); / 调用友元函数调用友元函数 友元函数没有友元函数没有this指指针!针!51C+面向对象程序设计面向对象程序设计一个函数可以定义为多个类的友元函数。一个函数可以定义为多个类的友元函数。【例【例4.19 】(】(110页)页)52C+面向对象程序设计面向对象程序设计

39、2.将成员函数声明为友元函数 一个类的成员函数也可以作为另一个类的一个类的成员函数也可以作为另一个类的友元友元,这种成员函数不仅可以访问自己所在类这种成员函数不仅可以访问自己所在类对象中的所有成员对象中的所有成员,还可以访问还可以访问friend声明语声明语句所在类对象中的所有成员。句所在类对象中的所有成员。 这样能使两个类相互合作、协调工作这样能使两个类相互合作、协调工作,完完成某一任务。成某一任务。 53C+面向对象程序设计面向对象程序设计 例例4.24 一个类的成员函数作为另一个类的友元。一个类的成员函数作为另一个类的友元。 #include #include class girl; c

40、lass boy public:boy(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; void disp(girl &); / 声明声明disp()为类为类boy的成员函数的成员函数 boy() delete name; private: char *name; int age; ; class girl public: girl(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; friend void boy:disp(gir

41、l &); girl() delete name; private: char *name; int age; ;54C+面向对象程序设计面向对象程序设计 void boy:disp(girl &x) / 定义友元函数定义友元函数disp() coutBoys name is name,age:agen; /访问访问boy类对象的成员类对象的成员 coutGirls name is ,age:x.agen; /访问访问girl类对象的成员类对象的成员 void main() boy b(Chen Hao,25); girl e(Zhang Wei ,18); b.d

42、isp(e); 程序运行结果如下程序运行结果如下: Boys name is Chen Hao ,age: 25 Girls name is: Zhang Wei ,age: 18 类的成员函数作为另一类的友元时,类的成员函数作为另一类的友元时,该类应该先定义该类应该先定义55C+面向对象程序设计面向对象程序设计4.5.2 友元类 一个类也可以作为另一个类的友元。一个类也可以作为另一个类的友元。例如例如: : class Y class Y / / ; ; class X class X / / friend Y; / friend Y; / 声明类声明类Y Y为类为类X X的友元类的友元类

43、/ ; ; 一个类被声明为另一个类一个类被声明为另一个类的友元时,它的所有成员的友元时,它的所有成员函数都成为另一个类的友函数都成为另一个类的友元函数。元函数。56C+面向对象程序设计面向对象程序设计【例】友元类的示例。#include class Sample int x;public: Sample(int a)x=a; friend class Operation; /把类Operation当作友元(好朋友);57C+面向对象程序设计面向对象程序设计class Operationpublic: int add(Sample& s1, Sample& s2) return

44、s1.x+s2.x; int subtract(Sample& s1, const Sample& s2) return s1.x-s2.x; ;int main( ) Sample s1(10) , s2(6); Operation obj; coutobj.add(s1, s2)endl; coutobj.subtract(s1, s2)endl; return 0;58C+面向对象程序设计面向对象程序设计4.6 类的组合 如果一个类的对象是另一个类的数据成员如果一个类的对象是另一个类的数据成员, ,则称则称这样的数据成员为对象成员(子对象)。例如这样的数据成员为对象成员(

45、子对象)。例如: : class A class A /. /. ; ; class B class B A a; / A a; /类类A A的对象的对象a a为类为类B B的对象成员的对象成员 public:public: / / ; ; 使用对象成员要注意的问题是对象成员的初始化使用对象成员要注意的问题是对象成员的初始化问题问题, ,即即类类B B的构造函数如何定义的构造函数如何定义? 59C+面向对象程序设计面向对象程序设计例如有以下的类例如有以下的类: : class Xclass X 类名类名1 1 对象成员名对象成员名1;1; 类名类名2 2 对象成员名对象成员名2;2; 类名类名

46、n n 对象成员名对象成员名n;n; ; ; 一般来说一般来说, ,类类X X的构造函数的定义形式为的构造函数的定义形式为; ;X:X(X:X(形参表形参表0):0):对象成员名对象成员名1(1(形参表形参表1),1), ,对象成员名对象成员名i(i(形参表形参表i) ,i) , ,对象成员名对象成员名n(n(形参表形参表n)n) / / 构造函数体构造函数体 60C+面向对象程序设计面向对象程序设计练习:写出程序的运行结果练习:写出程序的运行结果#includeclass Object int val; public:Object( );/构造函数Object( int i );/构造函数O

47、bject( ); /析构函数;61C+面向对象程序设计面向对象程序设计Object:Object( ) /默认构造函数 val=0; coutn Default constructor for Object.n;Object:Object( int i) /构造函数定义构造函数定义 val=i; coutn Constructor for Object: valendl;Object:Object( )/析构函数定义析构函数定义 coutn Destructor for Object: valendl;62C+面向对象程序设计面向对象程序设计class Container /定义新类,它含O

48、bject的对象 private:int date;Object one;/对象成员Object two;/对象成员 public:Container( );/构造函数Container( int i, int j, int k);/构造函数Container( ); /析构函数;63C+面向对象程序设计面向对象程序设计Container:Container( ) /默认构造函数定义 date=0; coutn Default constructor for Container.n;Container:Container( int i, int j, int k):two(i),one(j)

49、date=k; coutn Constructor for Container.n; Container:Container( ) coutn Destructor for Container.n; int main( )/主程序 coutn. Entering main .n; Container obj(5, 6,10); coutn. Exiting main .n; return 0;64C+面向对象程序设计面向对象程序设计4-7 共享数据的保护 4.7.1 常引用 如果在说明引用时用const修饰,则被说明的引用为常引用。 常引用的说明形式如下: const 类型说明符& 引

50、用名例如: int a=5; const int& b=a; 其中,b是一个常引用,它所引用的对象不允许更改。 65C+面向对象程序设计面向对象程序设计例例4.28 常引用作函数形参。常引用作函数形参。#includeint add(const int& i,const int& j);void main() int a=20; int b=30; couta+b=add(a,b)endl;int add(const int& i,const& j) return i+j;66C+面向对象程序设计面向对象程序设计4.7.2 常对象 如果在说明对象时用如果

51、在说明对象时用constconst修饰修饰, ,则被说则被说明的对象为常对象。明的对象为常对象。常对象的说明形式如下常对象的说明形式如下: : 类名类名 const const 对象名对象名(参数表参数表););或者或者 const const 类名类名 对象名对象名(参数表参数表);); 在定义对象时必须进行初始化在定义对象时必须进行初始化, ,而且不而且不能被更新。能被更新。 67C+面向对象程序设计面向对象程序设计例例4.29 4.29 非常对象和常对象的比较。非常对象和常对象的比较。#includeiostream#include.h class Sample class Sample

52、 public:public: int int m; m; Sample(int i,int Sample(int i,int j) m=i; n=j; j) m=i; n=j; void setvalue(int void setvalue(int i) n=i; i) n=i; void disply() coutm=mendl void disply() coutm=mendl; ; coutn=nendl coutn=nendl; ; private:private: int int n; n;void main()void main() Sample a(10,20); a.setv

53、alue(40); Sample a(10,20); a.setvalue(40); a.m=30; a.disply a.m=30; a.disply();(); 68C+面向对象程序设计面向对象程序设计4.7.3 常对象成员 1. 常数据成员常数据成员 使用使用const说明的数据成员称为常数据成说明的数据成员称为常数据成员。员。 如果在一个类中说明了常数据成员如果在一个类中说明了常数据成员,那那么构造函数就只能通过初始化列表对该数么构造函数就只能通过初始化列表对该数据成员进行初始化据成员进行初始化,而任何其他函数都不能而任何其他函数都不能对该成员赋值。对该成员赋值。 69C+面向对象程序设计面向对象程序设计例例4.30 常数据成员举例。常数据成员举例。#include class Date public: Date(int y,int m,int d); void showDate(); const int &r; private: const int year ; const int

温馨提示

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

评论

0/150

提交评论