C++铁道出版社第2版第四章.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C++铁道出版社第2版第四章.ppt》由会员分享,可在线阅读,更多相关《C++铁道出版社第2版第四章.ppt(97页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+铁道出版社第铁道出版社第2版版第四章第四章 第四章第四章 类和对象(二)类和对象(二)4.1 4.1 自引用指针自引用指针thisthis4.2 4.2 对象数组与对象指针对象数组与对象指针4.3 4.3 向函数传递对象向函数传递对象4.4 4.4 静态成员静态成员4.5 4.5 友元友元4.6 4.6 类的组合类的组合4.7 4.7 共享数据的保护共享数据的保护4.8 C+4.8 C+程序的多文件组成程序的多文件组成第第四四章章 类和对象(二)类和对象(二) 第四章第四章 类和对象(二)类和对象(二)4.1 4.1 自引用指针自引用指针thisthis 成员函数的存储方式成员函数的存储方
2、式 class Boxclass Box int x; int x; int print() coutx; int print() coutx; ; ; Box Box 对象对象1 1,对象,对象2, 2, 对象对象3;3; 不同对象的数据不同对象的数据成员存放在不同的成员存放在不同的内存地址内存地址 所有对象的成所有对象的成员函数对应的是同员函数对应的是同一个函数代码段一个函数代码段 第四章第四章 类和对象(二)类和对象(二)#include#include/例例4.14.1using namespace std;using namespace std;class Aclass A int
3、x; int x; public: public: A(int x1)x=x1; A(int x1)x=x1; void disp() cout when x= xvoid disp() cout when x= xendlendl; ; ;main()main() A a(1),b(2),c(3); A a(1),b(2),c(3); a.disp(); b.disp(); c.disp();a.disp(); b.disp(); c.disp(); return 0; return 0; a.x=1 b.x=2 c.x=3运行结果:运行结果:when x=1when x=1when x=2
4、when x=2when x=3when x=3 问题:问题:既然所有对既然所有对象的成员函数对应的是象的成员函数对应的是同一个函数代码段。同一个函数代码段。 如何确定分别输出的如何确定分别输出的是:是:a.x, b.x, c.xa.x, b.x, c.x 的的值值呢呢? ? 第四章第四章 类和对象(二)类和对象(二)#include#includeusing namespace std;using namespace std;class Aclass A int x; int x; public: public: A(int x1)x=x1; A(int x1)x=x1; void disp
5、() coutwhen x= void disp() coutwhen x= this-x; x; ;main()main() A a(1),b(2),c(3); A a(1),b(2),c(3); a.a.dispdisp(); b.(); b.dispdisp(); c.(); c.dispdisp();(); return 0; return 0; 当一个对象要调用成员函数时,当一个对象要调用成员函数时,thisthis指针指针中就装着该对象的地址中就装着该对象的地址, , 成员函数就根据这个成员函数就根据这个指针指针, ,找到相应的数据找到相应的数据, ,然而进行相应的操作。然而进行相
6、应的操作。a.xb.xc.x运行结果:运行结果:when x=1when x=1when x=2when x=2when x=3when x=3在在C+C+成员函数成员函数中事先设置了一中事先设置了一个名为个名为thisthis的对象指针的对象指针 第四章第四章 类和对象(二)类和对象(二) 在通常情况下,在通常情况下,thisthis指针指针在糸统中是在糸统中是隐式隐式地存在地存在的。我们也可以将其的。我们也可以将其显式显式地表示出来。地表示出来。 第四章第四章 类和对象(二)类和对象(二)#include /例例4.24.2using namespace std;class A int x
7、; public: A(int x1)x=x1; void disp() coutnthis=this when x=x;main() A a(1),b(2),c(3); a.disp(); b.disp(); c.disp(); return 0; 当执行当执行a.disp()a.disp()时,时,相当于执行相当于执行coutcout nthis=nthis= &a&a when x=when x=a.x;a.x; 显示显示thisthis指针的值,指针的值,即当前对象的地址即当前对象的地址运行结果:运行结果: this=0 this=0012012FFFF7c7c when x=1 wh
8、en x=1 this= this=0012FF780012FF78 when x=2 when x=2 this= this=0012FF740012FF74 when x=3 when x=3 第四章第四章 类和对象(二)类和对象(二)4.2.1 4.2.1 对象数组对象数组 定义一维对象数组的格式如下定义一维对象数组的格式如下: : 类名类名 数组名数组名 下标表达式下标表达式;例如例如: : exam ob4; exam ob4; 说明:共建立了说明:共建立了四个对象四个对象, ,即每一个数组元素是一即每一个数组元素是一个对象个对象( (即即ob0ob0、ob1ob1、ob2ob2、
9、ob3)ob3),共调用了,共调用了4 4次次构造函数。构造函数。4.2 对象数组与对象指针对象数组与对象指针 第四章第四章 类和对象(二)类和对象(二) 如果类中含有带有如果类中含有带有一个参数一个参数的构造函数的构造函数,则定义,则定义对象数组时,可通过初始值表进行赋值。对象数组时,可通过初始值表进行赋值。 例如例如: : exam ob4=11,22,33,44; exam ob4=11,22,33,44; 第四章第四章 类和对象(二)类和对象(二)例例4.4 4.4 用只有一个参数的构造函数给对象数组赋值用只有一个参数的构造函数给对象数组赋值。 #includeclass exam i
10、nt x; public: exam(int n) x=n; int get_x( ) return x; ;main( ) exam ob4= 11, 22, 33, 44; for (int i=0;i4;i+) coutobi.get_x( ) ;return 0; 通过通过初始值表初始值表给对象给对象数组赋值数组赋值带有带有一个参数一个参数的构造函数的构造函数 调用调用构造函数构造函数exam()exam()进行初始化进行初始化:ob0.x=11, ob1.x=22ob0.x=11, ob1.x=22ob2.x=33, ob3.x=44ob2.x=33, ob3.x=44程序运行结果如
11、下:程序运行结果如下: 11 22 33 4411 22 33 44相当于以下执行了四条语句相当于以下执行了四条语句: :coutob10.get_x() ;coutob10.get_x() ;coutob11.get_x() ;coutob11.get_x() ;coutob12.get_x() ;coutob12.get_x() ;coutob13.get_x() ;coutob13.get_x() ; 第四章第四章 类和对象(二)类和对象(二)例例4.4-1 4.4-1 用只有一个参数的构造函数给对象数组赋值。用只有一个参数的构造函数给对象数组赋值。 #includeclass exam
12、 int x; public: exam(int n) x=n; int get_x( ) return x; ;main( ) exam ob4= exam(11), exam(22), exam(33), exam(44); for (int i=0;i4;i+) coutobi.get_x( ) ;return 0; 通过初始值表给对象数通过初始值表给对象数组赋值的组赋值的另一种方法另一种方法带有带有一个参数一个参数的构造函数的构造函数 调用调用构造函数构造函数exam()exam()进行初始化进行初始化:o b 0 . x = 1 1 , o b 0 . x = 1 1 , ob1.x
13、=22ob1.x=22o b 2 . x = 3 3 , o b 2 . x = 3 3 , ob3.x=44ob3.x=44程序运行结果如下:程序运行结果如下: 11 22 33 4411 22 33 44 第四章第四章 类和对象(二)类和对象(二) 在设计类的构造函数时就要充分考虑到对象数组元在设计类的构造函数时就要充分考虑到对象数组元素初始化的需要。素初始化的需要。 当各元素对象的当各元素对象的初值要求为不同的值时初值要求为不同的值时, ,需要定义需要定义带参数带参数( (无默认值无默认值) )的构造函数,的构造函数,如上例。如上例。 当各个元素的当各个元素的初始值为相同的值时初始值为相
14、同的值时, ,可以在类中定可以在类中定义义不带参数的构造函数或带有默认参数值的构造函数不带参数的构造函数或带有默认参数值的构造函数。 第四章第四章 类和对象(二)类和对象(二)#include /例4.5-1using namespace std;class exam int x; public: exam( ) x=123; exam(int n) x=n; int get_x() return x; ; int main() exam ob4=55,66; int i; for (i=0;i4;i+) coutobi.get_x() ; return 0; 不带参数的构造函数不带参数的构造
15、函数带带一个参数一个参数的构造函数的构造函数运行结果如下运行结果如下; ;55 66 123 12355 66 123 123 第四章第四章 类和对象(二)类和对象(二) 如果类中含有带有如果类中含有带有多个参数多个参数的构造函数,的构造函数,则定义对象数组时应当如何实现初始化呢?则定义对象数组时应当如何实现初始化呢? 第四章第四章 类和对象(二)类和对象(二)#include #include using namespace std;using namespace std;class Rectangleclass Rectangle public: public: Rectangle(int
16、 len=10,int wid=10) Rectangle(int len=10,int wid=10) length=len; width=wid; length=len; width=wid; int area()return(lengthint area()return(length* *width);width); private: private: int length,width; int length,width;int main()int main() Rectangle Rectangle rec3= rec3= Rectangle(10,20), Rectangle(10,
17、20), Rectangle(30,40), Rectangle(30,40), Rectangle(50,60) ; Rectangle(50,60) ; coutThe area of rec0 is coutThe area of rec0 is rec0.area()rec0.area()endl; endl; coutThe area of rec1 is coutThe area of rec1 is rec1.area()rec1.area()endl; endl; coutThe area of rec2 is coutThe area of rec2 is rec2.area
18、()rec2.area()endl; endl; return 0; return 0; 例例4.64.6用带有多个用带有多个参数的构造函数参数的构造函数给对象数组赋值给对象数组赋值 rec0.length=10rec0.length=10rec0.width=20rec0.width=20程序运行结果如下程序运行结果如下: :The area of rec0 is 200The area of rec0 is 200The area of rec1 is 1200The area of rec1 is 1200The area of rec2 is 3000The area of rec2
19、is 3000rec1.length=30rec1.length=30rec1.width=40rec1.width=40rec2.length=50rec2.length=50rec2.width=60rec2.width=60 第四章第四章 类和对象(二)类和对象(二) 4.2.2 4.2.2 对象指针对象指针 对象指针对象指针就是用于存放对象地址的指针变量。就是用于存放对象地址的指针变量。 声明对象指针的一般语法形式为声明对象指针的一般语法形式为: : 例如例如: : exe exe * *p; p; /定义类定义类exeexe的对象指针变量的对象指针变量P P 类名类名* 对象指针名对
20、象指针名; 第四章第四章 类和对象(二)类和对象(二)1. 1. 用对象指针访问单个对象成员用对象指针访问单个对象成员 class Dateclass Date . . . . . .;int main()int main() Date date;Date date; / /定义类定义类DateDate的对象的对象datedate Date Date * *pd; /pd; /定义定义pdpd为指向类为指向类DateDate的对象指的对象指针变量针变量 pd=&date;pd=&date; . . . . . . 将对象将对象datedate的地址的地址赋给对象指针赋给对象指针变量变量pdpd
21、 第四章第四章 类和对象(二)类和对象(二) #include /#include /例例4.7 4.7 using namespace std;using namespace std;class Dateclass Date public:public: void setDate(int y,int m,int d) void setDate(int y,int m,int d) year=y; month=m; day=d; year=y; month=m; day=d; void showDate() void showDate() coutyear.month.dayendl; cou
22、tyear.month.day-setDate(2009,11,14);setDate(2009,11,14); pdpd-showDate(); showDate(); return 0; return 0; 用对象指针访问单用对象指针访问单个对象成员个对象成员调用调用pdpd所指向的对象所指向的对象datedate中的函数中的函数setDatesetDate调用调用pdpd所指向的对所指向的对象象datedate中的函数中的函数showDateshowDate用用对象指针对象指针访问对象成员时,访问对象成员时,不能用不能用“.”.”操作符,而应操作符,而应使用使用“- ” ”操作符操作符
23、第四章第四章 类和对象(二)类和对象(二) 2. 2. 用对象指针访问对象数组用对象指针访问对象数组 Date Date * *pd; /pd; /定义指向类定义指向类DateDate的对象指针变量的对象指针变量pdpd Date date2 / Date date2 /定义类定义类DateDate的对象数组的对象数组date2date2 pd=date; / pd=date; /把对象数组把对象数组datedate的第的第1 1个元素个元素date0date0 / /的地址赋给对象指针的地址赋给对象指针pdpd。 第四章第四章 类和对象(二)类和对象(二) #include #include
24、 using namespace std;using namespace std;class Dateclass Date /声明类声明类DateDate public: public: void setDate(int y,int m,int d) void setDate(int y,int m,int d) year=y; month=m; day=d; year=y; month=m; day=d; void showDate() void showDate() coutyear.month coutyear.month .dayendl.dayshowDate(); pd-showD
25、ate(); pd+; / pd+; /对象指针变量对象指针变量pdpd加加1,1,即指向下一个元素即指向下一个元素date1date1的地址的地址 pd-showDate(); pd-showDate(); return 0; return 0; 调用元素调用元素date0date0的的成员函数成员函数setDatesetDate程序运行结果为程序运行结果为: : 2009 .11.142009 .11.142009 .12.252009 .12.25调用元素调用元素date1date1的的成员函数成员函数setDate setDate 调用调用pdpd所指向的对象所指向的对象date0da
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 铁道 出版社 第四
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内