1任课教师:单立娟Email:shan_lijuan@126.com2定义一个Circle类,有数据成员Radius(半径),//成员函数GetArea(),计算圆的面积,构造一个Circle的对象进行测试。实例导入32.3C++源程序的构成•C++源程序主要由三部分构成•类声明•类成员函数的实现•main函数(其中有各类声明的对象)•说明•C++程序从根本上说是由包括main()在内的一组函数组成,只不过放入类而已•C++文件分为类:*.h和*.cpp文件42.3C++源程序的构成(续)C++程序是一组相互通信的类对象老师类学生类张三李四王五赵六类刘老师实例对象main主控对象52.3C++源程序的构成(续)•C++程序的函数本质1C++程序从根本说是由若干个互相调用的函数组成的,只不过函数封装到类中,因此程序表现为多个类对象通信。2一个程序必须有,且只能有一个主体——入口主函数main()。3其他函数都是由main函数直接或者间接地调用。62.4面向对象程序设计•程序设计的发展历程机器语言汇编语言高级语言面向过程面向对象CPU指令系统,由0、1序列构成的指令码组成如:10000000加10010000减面向机器的语言程序设计是数据被加工的过程客观世界可以分类,对象是类的实例对象是数据和方法的封装对象间通过发送和接受消息发生联系程序设计关键是定义类,并由类派生对象用助记符号描述的指令系统如ADDA,B71.相关概念•在面向对象编程中,现实世界被描述成实体,每一个实体都是对象。1.类:具有相同特性(数据元素)和相同行为(函数)的对象的抽象,如汽车类、人类等。2.对象:是现实世界实际存在的事物,是类的一个具体实例,对象由一组属性和一组行为构成。3.属性:类中的特性(数据)称为类的属性,如汽车的颜色书的作者、书名等都是属性。4.方法:类中的行为(函数)称为类的方法(行为),如汽车的刹车、加速行为等都是方法。5.消息:系统中多个对象之间通过一定的渠道相互联系,要使某一个对象实现某一种行为,应当传送相应的消息。82.类和对象关系•类(class):从一个个具体的事物中把共同特征抽取出来形成的一个概念,它反映了事物之间的共性。•对象(object):类的具体实例,是现实世界中的客观事物。•面向对象程序设计中的类,是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了抽象的描述。对象是类的实例,类是同种对象的抽象。类是抽象的,不占用内存;而对象是具体的,占用内存空间93.面向对象程序设计的特点•抽象性:面向对象程序设计鼓励程序员以抽象的观点看待程序,即程序是由一组对象组成的。我们可以将一组对象的共同特征进一步抽象出来,从而形成“类”的概念。•封装性:就是指一组数据和与这组数据有关的操作集合组装在一起,形成一个能动的实体,也就是对象。数据封装就是给数据提供了与外界联系的标准接口,无论是谁,只有通过这些接口,使用规范的方式,才能访问这些数据。在对象内,只有属于该对象的成员函数才可以存取该对象的数据成员。这样,其他函数就不会破坏到它的内容,从而起到保护和隐藏数据的效果。如一个学生可以作为一个对象,10个不同的学生是10个对象。如果这10个学生对象有相同的属性和行为,可以将它们抽象为一种类型,称为学生类型。在C++中,这种类型就称为“类(class)”。这10个学生就是属于同一“类”的对象。相机,电视等10面向对象程序设计的特点•继承性:从已有的对象类型出发建立一种新的对象类型,使它继承原对象的特点和功能,它允许和鼓励类的重用,提供了一种明确表达共性的方法。这种思想是面向对象设计方法的主要贡献。•多态性:同一消息被不同的对象接收后被解释为不同含义的能力,也就是一个接口名称具有多种功能。小汽车继承交通工具的特征在Windows下,用鼠标双击一个文件对象(这就是向对象传送一个消息),如果对象是一个可执行文件,则会执行此程序,如果对象是一个文本文件,则启动文本编辑器并打开该文件114.从结构体到类结构体类型的定义:structStudent{charnum[10];charname[20];charsex;};Studentstud1,stud2;classStudent{charnum[10];charname[20];charsex;voiddisplay(){cout“num:“numendl;cout“name:“nameendl;cout“sex:“sexendl;}};Studentstud1,stud2;数据成员成员函数是用来对数据成员进行操作的,也称“方法”。类是一种数据类型,既包含数据,又包含操作数据的函数。类的声明:定义一个Student结构体:包括学号、姓名、性别12类与结构的区别:•(1)在C中,结构体中不允许有成员函数,而在C++中结构体可以有成员函数。•(2)在C++中,结构体是用struct声明的,默认情况下其成员函数是公有(public)的,在需要显式声明时可以改变;•(3)在C++中,类和结构的惟一区别是:类(class)定义中默认情况下其成员是private访问权限,而结构(struct)定义中默认情况下其成员是public访问权限。13classStudent{private:charnum[10];charname[20];charsex;public:voiddisplay(){cout“num:“numendl;cout“name:“nameendl;cout“sex:“sexendl;}};Studentstud1,stud2;不能把类中的全部成员与外界隔离,如何实现类中的成员与外界的联系呢?一般是把数据隐蔽起来,而把成员函数作为对外界的接口。私有成员,只能被本例中的成员函数引用公有成员,既可以被本例中的成员函数引用,也可以被类的作用域内的其他函数引用14定义一个Circle类,有数据成员Radius(半径),//成员函数GetArea(),计算圆的面积,构造一个Circle的对象进行测试。练习一155.类的定义•类的定义分为说明部分和实现部分。•说明部分:是用来说明类中的成员,包含数据成员和成员函数的说明。•实现部分:是用来对成员函数进行定义。•类的说明部分格式如下:classClassName{private:…//私有数据成员和成员函数public:…//公有数据成员和成员函数protected:…//受保护的数据成员和成员函数};私有访问权限,为默认值,可缺省16类的三种访问权限,也称为成员访问限定符public:是一些操作(即成员函数),既可以被本类中的成员函数引用,也可以被类的作用域的其他函数引用。如:stud1.display();private:是一些数据成员,用户无法访问它们,只有本类中的成员函数或经特殊说明的函数才可以引用它们,它们是被隐藏的部分。如:stud1.num;×protected:保护成员具有公有成员和私有成员的双重角色,对派生类的成员函数而言,它是公有成员,即派生类的成员函数可以访问基类的保护成员。但对所在类之外定义的其它函数或类的对象而言,则是私有成员。6.类的访问权限177.定义类的注意事项•Class是定义类的关键字,ClassName是类名,不能为关键字和保留字。•关键字public、private、protected在类中多次出现时,前后的顺序没有关系。•类体中不允许对所定义的数据成员进行初始化。•可以将类的定义放在.h文件中,将成员函数的实现放在与.h同名的.cpp文件中。classtdate{public:…private:intyear=1998,month=4,day=8;};//是错误的因为类是一个数据类型,其定义以后并没有存储空间,因此,数据成员就不能进行初始化(但静态数据成员可以在类外进行初始化。)当某个程序文件中要用到该类时,只需用include嵌入该类的.h头文件即可。188.类的成员函数类的实现部分即为成员函数,方式与定义普通函数大体相同,它也有返回值和函数类型,区别是它只属于一个类的成员,出现在类体中。在使用类函数中,要注意调用它的权限(能否被调用)和使用域(函数能使用什么范围的数据和函数)。一般将需要被外界调用的成员函数指定为public,是类的对外接口,但并非要求把所有的成员函数都指定为public。如果一个类不包含成员函数,那等于C中的结构体,体现不了类在面向对象中的作用。19在类外定义成员函数前面看到成员函数可以在类体内定义,也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。若在类说明外部定义成员函数,则应使用作用域限定符::指明该函数是哪个类中的成员函数。格式为:返回类型类名::成员函数名(参数表){函数体}20classStudent{public:voiddisplay();//公用成员函数原型声明private:charnum[10];charname[20];charsex;//以上3行是私有数据成员};voidStudent∷display()//在类外定义display类函数{cout″num:″numendl;cout″name:″nameendl;cout″sex:″sexendl;}Studentstud1,stud2;域运算符(::)用于指出该函数是哪一个类的成员函数自家人不客气在成员函数中访问成员不能加对象名来作为前缀例:219.定义成员函数的注意事项1.在类体中直接定义函数时,不需要在函数名前加上类名。在类外定义时,要在函数名前加上类名,予以声明函数属于哪个类。Student∷display()表示Student类的display函数。2.如果“∷”前面没有类名,或者函数名前面既无类名又无作用域运算符,如∷display()或display(),则表示这个函数不是成员函数,而是全局函数。3.成员函数必须先在类体中作原型说明,然后在类外定义否则便出错。22inline成员函数当成员函数的规模较小时,语句只有1-5行,符合内联函数条件,则可在类中定义成员函数,成为内联成员函数。引入内联函数的目的是为了解决程序中函数调用的效率问题。内联函数在调用时不像一般函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中执行其后语句,而是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换。10.内联函数类的成员函数分为内联函数和外联函数。内联函数是指那些定义在类体内的成员函数(即:该函数的函数体放在类体中);而说明在类体内,定义在类体外的成员函数叫外联函数(函数的函数体放在类体外);外联函数变成内联函数,只需要在函数开头加上关键字inline就可以了23一般内联函数用关键字inline声明,但对类内定义的成员函数,可以省略inline。也可以写成inlinevoiddisplay()classStudent{public:voiddisplay(){cout″num:″numendl;cout″name:″nameendl;cout″sex:″sexendl;}private:charnum[10];charname[20];charsex;};24classStudent{public:inlinevoiddisplay();//声明此成员函数为内联函数private:charnum[10];charname[20];charsex;};inlinevoidStudent∷display()//在类外定义display函数为内联函数{coutnum:numendl;coutname:″nameendl;cout″sex:″sexendl;}如果成员函数不在类体内定义,而在类体外定义,系统并不默认为内联函数,调用过程和一般函数相同。若想成为内联函数,应用inli