资源预览内容
第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
第9页 / 共51页
第10页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
网络游戏开发语言基础-C+专业教程理论讲解部分Ver3.11第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 什么是类,什么是对象?例如:轿车,公交车,货车我们通通可以把他们叫做车。再如麻雀,燕子,啄木鸟我们通通可以把他们叫做鸟。具有相同特征和属性的事物,人们往往把他们称之为某一个类。车类,鸟类,人类。2第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 什么是类,什么是对象?类是一个抽象的概念。什么是抽象?简单说,不具体的事物就是抽象的。类是一个泛指。既然有抽象,一定会有具体。具体的事物我们称之为对象。你看到一个人,那么这个人就是一个对象。你想到我们全人类,那么这个全人类就是一个类。3第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 程序中的类和对象?现实世界是这样,在程序里面也是这样。程序里面,把具有相同属性的事物定义为一类,具体的某一个事物定义为一个对象。类是具体对象的共性,而具体对象的属性值各不相同。例如,我们都是人类,都有姓名,性别等特征但是每个人的姓名都是不一样的。下面,我们来看如何定义一个类。4第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 程序中的类和对象?定义类和定义结构体很相似:下面是定义结构体的代码:struct Humanchar *sex;char *name;5第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 定义类上面是结构体的定义,我们再来看下类的定义#include iostreamusing namespace std;#include string class Humanchar *sex;char *name;void eat()cout类可以有动作,而结构体不会有动作endl; 6第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 类和结构体的区别1注意,结构体里面不会有方法,而类里面可以定义方法,也就是说类是可以有动作的,而结构体只是用来存储数据的。2在类中定义的成员分为:private,public,protected三个访问权限,分别表示:私有,公有,受保护。 当然,要想测试这些权限,我们必须首先了解类中成员的设置和访问:7第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 对象的定义 我们知道,定义类就是一个新的数据类型,类只是一个类型,我们需要这个类型来定义新的变量,而这个变量我们称之为对象。定义:Human man;定义了一个Human类的实例,man是Human类的某一个具体的对象。8第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 设置或者获取类成员 和结构体相似,我们可以使用 “.” 来设置或者获取类中成员:man.name=“tony;coutman.name;9第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 完整代码好了,现在我们把代码写完整#include iostreamusing namespace std;#include string class Humanchar *sex;char *name;void eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;Human man; void main() man.name=;coutman.name;10第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 完整代码编译后,出现错误,提示:无法访问 private 成员(在“Human”类中声明)private表示私有,这里编译器认为,成员变量name是私有的。刚才,我们提到了:在类中定义的成员分为:private,public,protect三个访问权限,分别表示:私有,公有,受保护。11第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 访问权限私有的表示,只有在类里面可以使用该成员,在类外面就不能使用该成员。这样就限制了类外的访问权限。上面的代码,我们在函数main中去访问类中的name属性,显然是在类外访问。而有人会问,我们并没有写private关键字,为什么是私有的,c+中的成员如果没有写任何访问权限,默认为私有的,那么,是否能够定义为公有的呢?访问权限到底如何定义呢?12第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 访问权限我们可以这样修改代码:#include iostreamusing namespace std;#include string class Humanprivate:char *sex;char *name;void eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;Human man; void main() man.name=;coutman.name;13第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 访问权限我们在sex成员的前面加了代码:private:表示,sex,name,eat都是私有的。这样,在类外,我们就不能去访问这些数据成员了。 14第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 访问权限当然我们可以设为他们为公有,公有表示,在类外可以访问这些成员把把private该为该为public#include iostreamusing namespace std;#include string class Humanpublic:char *sex;char *name;void eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;Human man;void main() man.name=;coutman.name;再次编译下程序,发现这次没有错误了。15第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 访问权限由于公有和私有的定义方式,就可以保证类中的个别数据的安全性。受保护的,等我们讲到继承的时候,详细讲解。总结,区别:总结,区别:1.类中可以定义函数,而结构体不能类中可以定义函数,而结构体不能2.类中的成员有访问权限,而结构体里面的成员可以随意访问类中的成员有访问权限,而结构体里面的成员可以随意访问16第第045课 类的概念及定的概念及定义10 类的概念及定义10.3.7 类和结构体的选择那么什么时候选择结构体,什么时候选择类呢?根据他们的区别来选择:如果只需要用来存储数据,用结构体方便。1.如果不但需要存储结构体,还需要有自己的方法,类必选。2.如果成员变量需要控制访问权限,类必选。17第第045-2课 对象的定象的定义11 对象的定义对象的定义知道了如何定义类那么如何定义对象呢?我们前面已经简单讲解过了,现在我们了解下所有的定义方式:1.先声明类型,后定义对象class Human ;Human man;18第第045-2课 对象的定象的定义11 对象的定义对象的定义2.直接定义对象#include iostreamusing namespace std;#include string class Humanpublic:char *sex;char *name;void eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;man;void main() man.name=;coutman.name; 19第第045-2课 对象的定象的定义11 对象的定义对象的定义3.不出现类名,直接定义对象#include iostreamusing namespace std;#include string class public:char *sex;char *name;void eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;man;void main() man.name=;coutman.name; 20第第045-3课 成成员函数定函数定义12 成员函数的定义成员函数的定义前面我们已经学习了,可以在类中定义函数,前面我们已经学习了,可以在类中定义函数,其实我们也可以在类外定义函数:其实我们也可以在类外定义函数:#include iostreamusing namespace std;#include string class Humanpublic:char *sex;char *name;void eat();man;21第第045-3课 成成员函数定函数定义12 成员函数的定义成员函数的定义(接上代码)void Human:eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;void main() man.eat(); 注意,虽然我们可以在类外定义类的函数,但是有几个地方我们需注意,虽然我们可以在类外定义类的函数,但是有几个地方我们需要了解:要了解:1.必须先要在类中声明类的函数:必须先要在类中声明类的函数:void eat();2.定义函数的时候,必须在函数前面加上类的前缀,如:定义函数的时候,必须在函数前面加上类的前缀,如:void Human:eat()中的中的Human:22第第045-4课 类和和对象存象存储方式方式13 类和对象存储方式类和对象存储方式我们知道,任何变量都是有地址的,也就是说任何变量都会占用空我们知道,任何变量都是有地址的,也就是说任何变量都会占用空间,对象也不例外。间,对象也不例外。当定义对象的时候,会为对象分配空间。当定义对象的时候,会为对象分配空间。当然,如果我们为同一个类定义当然,如果我们为同一个类定义10个对象,那么就分配个对象,那么就分配10个对象大个对象大小的空间。小的空间。我们再来想,类内的成员变量由于值不一定相同,所以他们存储的我们再来想,类内的成员变量由于值不一定相同,所以他们存储的地址肯定不同,地址肯定不同,但是成员函数的代码一样,如果我们为一样的成员函数分配但是成员函数的代码一样,如果我们为一样的成员函数分配10个空个空间,岂不是浪费资源?间,岂不是浪费资源?那么是否可以把这那么是否可以把这10个函数指向一个空间呢?个函数指向一个空间呢?23第第045-4课 类和和对象存象存储方式方式13 类和对象存储方式类和对象存储方式如果这样做,就是成员变量存储在不同的空间,而所有的函数都指如果这样做,就是成员变量存储在不同的空间,而所有的函数都指向同一个空间,那么向同一个空间,那么大大的节约了大大的节约了9个函数的空间,显然这样做非常高效。个函数的空间,显然这样做非常高效。那么下面,我们来测试下,定义一个类,里面具有成员变量和函数,那么下面,我们来测试下,定义一个类,里面具有成员变量和函数,输出该类的对象的大小。输出该类的对象的大小。24第第045-4课 类和和对象存象存储方式方式13 类和对象存储方式类和对象存储方式#include iostreamusing namespace std;#include string class Humanpublic:int a;int b;void eat();man;void Human:eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;void main() coutsizeof(man)endl; 25第第045-4课 类和和对象存象存储方式方式13 类和对象存储方式类和对象存储方式上面的代码,结果是上面的代码,结果是8显然,一个对象占用的大小,取决于它的成员变量的大小,与成员函数无关。显然,一个对象占用的大小,取决于它的成员变量的大小,与成员函数无关。那么就有人会问,成员函数房在什么地方了呢?那么就有人会问,成员函数房在什么地方了呢?成员函数的存储是在对象空间之外的。成员函数的存储是在对象空间之外的。就像我们刚才猜测的那样,如果定义了就像我们刚才猜测的那样,如果定义了10个对象,那么这个个对象,那么这个10个对象个对象的函数地址是一样的。的函数地址是一样的。值得注意的是:虽然地址一样,但是因为我们传递参数可能不同,所以执行值得注意的是:虽然地址一样,但是因为我们传递参数可能不同,所以执行结果结果并不一定相同。并不一定相同。这个应该不难理解。这个应该不难理解。26第第045-4课 类和和对象存象存储方式方式13 类和对象存储方式类和对象存储方式我们来试验下:我们来试验下:#include iostreamusing namespace std;#include string class Humanpublic:char *name ;void getName();man1,man2; 27第第045-4课 类和和对象存象存储方式方式13 类和对象存储方式类和对象存储方式(接上段代码)void Human:getName()coutnameendl;void main() man1.name=tony;man1.getName();man2.name=jack;man2.getName();28第第045-4课 类和和对象存象存储方式方式13 类和对象存储方式类和对象存储方式结果:结果:显然,同样的方法,执行的结果却不一样。显然,同样的方法,执行的结果却不一样。29第第045-5课 成成员引用引用14 成员引用成员引用1.成员变量的引用成员变量的引用和结构体一样,成员的引用使用和结构体一样,成员的引用使用.当然,成员函数的应用也是一样当然,成员函数的应用也是一样man.eat();30第第045-5课 成成员引用引用14 成员引用成员引用2.通过指针通过指针我们知道,结构体的成员变量也可以通过指针来获取,我们知道,结构体的成员变量也可以通过指针来获取,对象也是如此。对象也是如此。#include iostreamusing namespace std;#include string class Humanpublic:int a;int b;void eat();man;31第第045-5课 成成员引用引用14 成员引用成员引用(接上段代码)void Human:eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;void main() Human *p=&man;coutaendl; 32第第045-5课 成成员引用引用14 成员引用成员引用(接上段代码)3.通过引用通过引用还有就是通过引用来获取还有就是通过引用来获取#include iostreamusing namespace std;#include string class Humanpublic:int a;int b;void eat();man;33第第045-5课 成成员引用引用14 成员引用成员引用(接上段代码)void Human:eat()cout类可以有动作,而结构体不会有动作类可以有动作,而结构体不会有动作endl;void main() Human &NewMan=man;coutNewMan.at1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.sect1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.sect2.hour;cint2.minute;cint2.sec;coutt2.hour:t2.minute:t2.sect.hour;cint.minute;cint.sec;void getTime(Time &t)coutt.hour:t.minute:t.sechour;cinminute;cinsec;void getTime()couthour:minute:secendl;42第第045-6课 简单应用用15 成简单应用简单应用3void main() Time t1,t2;t1.setTime();t1.getTime();t2.setTime();t2.getTime();43第第045-6课 简单应用用15 成简单应用简单应用3显然,我们看出,这样写思路清晰,代码简明但是有些地方需要我们多多注意:1.在调用方法的时候,必须指明调用的对象,不同对象调用方法的结果可能不同。2.在类外定义函数时,必须定义函数的作用域。例如:44第第045-6课 简单应用用15 成简单应用简单应用3public:void getTime();void Time:getTime()couthour:minute:secendl;如果不定义函数的访问权限,我们是不能使用的45第第045-6课 简单应用用15 成简单应用简单应用33.由于我们定义了部分成员为私有,这样就保护了这些成员,不能被随意的修改,只能通过setTime方法来实现设置。安全性大大提高。4.要分清楚“:” 和“ . ”的作用。46第第045-6课 简单应用用15 成简单应用简单应用4找出整型数组中的最大值。(使用类实现)#include iostreamusing namespace std;#include string class Array_maxprivate:int myArray5;int max;public:void set_value();void max_value();void show_value();47第第045-6课 简单应用用15 成简单应用简单应用4void Array_max:set_value()int i;for(i=0;imyArrayi;void Array_max:max_value()int i;max=myArray0;for(i=1;imax)max=myArrayi;48第第045-6课 简单应用用15 成简单应用简单应用4void Array_max:show_value()coutmax=max; void main() Array_max arrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();49第第045-6课 简单应用用15 成简单应用简单应用5定义类,包含学生名称和某一门课成绩。定义类数组,实现成绩的排序。50第第045-5课 成成员引用引用14 作业1.输入某个学生的学号、五门课的考试成绩,输出输入某个学生的学号、五门课的考试成绩,输出5门课的平均分门课的平均分使用对象实现(对象包含五门课的成绩)。使用对象实现(对象包含五门课的成绩)。2.课本第六题课本第六题 51
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号