《《类和对象举例》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《类和对象举例》PPT课件.ppt(47页珍藏版)》请在三一办公上搜索。
1、C+程序设计,第3讲 类和对象的简单应用举例,#include void swap3(int,输出:x=9,y=5a=9,b=5,例:分析下列程序的输出结果(引用调用)。,用const限定引用,由于引用作为参数时,函数内对引用的修改等于对实参的修改,因此一不注意就会造成错误。保护实参不被修改的方法是传递const指针或const引用。,Void swap(const int/不允许,ry是常量引用,符号常量:,const 类型定义符 符号名=初值;,例如:const int PRICE=30;,经const修饰后便不能修改此符号名之值。例:const int sumValue=10;对于简单类
2、型的常量,const可在类型符的前或后 或 int const sumValue=10;sumValue=0;/错误,使用const的目的是替代C语言中的编译预处理命令#define(常量定义),但比它更加语义精确,因为#define无法准确地反映常量的数据类型。,void main()/定义圆周率常量PIdouble radius;/定义圆半径变量double area;/定义圆面积变量double circumference;/定义圆周长变量cout radius;area=PI*radius*radius;circumference=2.0*PI*radius;cout“Area of
3、circle of radius”radius“is”area“n”;cout“and its circumference is”circumference“n”;radius=25.6;/正确 PI=2.5;/错误,1.const是一个类型说明符,它将一个变量变为一个符号常量(相当于一个只读变量)。例如:const double PI=3.14;/常量经常用大写名称表示用const定义的PI为符号常量,不仅有数据类型,而且还有值,必须要有初值,其值在程序中不可变。编译时会做检查。#define PI 3.14/是一个无参宏定义无参宏不是符号常量,没有数据类型,没有值,在内存中不分配地址。宏定
4、义在预编译时,只进行简单的替换,不做语法检查。,const与#define的区别:,2.由#define所定义的符号名为全局性常量,因而在整个程序中应保持符号名的唯一性;用#define定义的常量的作用域是从定义时开始,直到使用#undef取消定义时为止,如果不取消定义,直到整个文件结束const可以说明一个局部或全局性同名常量(据此可以改变const符号名之值)。3.另外在语法方面,#define为编译预处理命令,而const为定义符,语句以“;”结束。,#define Min 1const int Max=100;void main(void)#define Min 2/错误,不能再定义同
5、名常量 const int Max=200;/可以再定义同名局部常量,1.类和对象的简单应用举例,#include class Time public:int hour,minute,sec;int main()Time t1;cint1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.secendl;return 0;,/定义Time类,/数据成员为公用的,/定义Time类的对象t1,/为t1的成员输入数据,/其中通过对象名引用其数据成员,例1、最简单的例子(引用一个对象),在引用成员时,不要忘记对象名,如果删去这3个输入语句,则输出
6、结果是不可预知的,1.类和对象的简单应用举例,#include class Time private:int hour,minute,sec;public:void inputtime()cinhour;cinminute;cinsec;void outtime()couthour:minute:secendl;,/定义Time类,/数据成员为私有的,例1、最简单的例子(引用一个对象),void main()Time t1;t1.inputtime();t1.outtime();,1.1 类和对象的简单应用举例,void main()Time t1,t2,t3;/定义对象t1、t2、t3 t1
7、.inputtime();t1.outtime();t2.inputtime();t2.outtime();t3.inputtime();t3.outtime();,例2a、引用多个对象的成员,8.5 类和对象的简单应用举例,例2b、引用多个对象的成员,void set_time(Time,8.6 类和对象的简单应用举例,例2c、引用多个对象的成员,数据成员的值不再由键盘输入,而是在调用函数时由实参提供,并在函数中使用了默认参数。,#include using namespace std;class Time private:int hour,minute,sec;public:void se
8、ttime(int h,int m,int s)hour=h;minute=m;sec=s;,void shoutime()couthour:minute:secendl;,int main()Time t1;t1.settime(12,15,10);t1.shoutime();return 0;,#include class Time private:int hour,minute,sec;public:void settime(int h,int m,int s=20)hour=h;minute=m;sec=s;void shoutime()couthour:minute:secendl;
9、int main()Time t1;t1.settime(12,15);t1.shoutime();return 0;,输出结果:12:15:20,函数参数的求值顺序,当一个函数带有多个参数时,C+语言没有规定函数调用时实参的求值顺序;,编译器根据对代码进行优化的需要自行规定对实参的求值顺序;,在实参中注意不要使用带有副作用的运算符,此时可能产生二义性;,下例由于使用对参数求值顺序不同的编译器造成的二义性。,函数参数的求值顺序,#include int add(int x,int y)return x+y;void main()int x(4),y(6);int z=add(+x,x+y);c
10、outzendl;,可能的结果(按照编译器对实参求值顺序不同):,自左至右,两个实参的值分别为5和11;,自右至左,两个实参的值分别为5和10;,注意:函数参数求值顺序与参数默认值补足顺序不同参数求值顺序:由编译器决定求值方向;参数默认值补足顺序:自左向右,设置函数参数的默认值(缺省参数),C+中,在函数声明或定义时可以为一个或多个参数指定缺省参数值;,int add(int x,int y=10);,进行函数调用时,若未指定足够的实参,则编译器将按从左向右的顺序用函数声明或定义中的缺省值来补足所缺少的实参;,设置函数参数的默认值(续),在一个指定了缺省值的参数的右边,不能出现没有指定缺省值的
11、参数;,void f(int x,int y=1,int z);,在给某个参数指定缺省值时,不仅可以是一个数值,而且可以是任意复杂的表达式;,int f();void delay(int k,int time=f();,错误,例如:f(2,4);理想:f(2,1,4),实际:z参数未被赋值,1.类和对象的简单应用举例,例3、找出一个整型数组中的最大元素,这里使用类来处理。,#include using namespace std;class Array_max public:void set_value();void max_value();void show_maxvalue();priva
12、te:int array10;int max;void Array_max:set_value()for(int i=0;iarrayi;,void Array_max:max_value()max=array0;for(int i=1;imax)max=arrayi;void Array_max:show_maxvalue()coutmax=max;int main()Array_max arrmax;arrmax.set_value();arrmax.max_value();arrmax.show_maxvalue();return 0;,可以看出,主函数十分简单,只需调用有关对象的成员函
13、数,以完成相应的操作。在面向对象的程序设计中,最关键的工作是类的设计,所有的数据和对数据的操作都体现在类中。,例3、找出一个整型数组中的元素的最大值,#include using namespace std;class Array_max public:void set_value();void max_value();void show_value();private:int array10;int max;void Array_maxset_value()int i;for(i=0;iarrayi;void Array_maxmax_value()int i;max=array0;for(
14、i=1;imax)max=arrayi;,void Array_maxshow_value()coutmax=max;int main()Array_max arrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return 0;,/声明类,/以下3行为成员函数原型声明,/对数组元素设置值,/找出数组中的最大元素,/输出最大值,/整型数组,/成员函数定义,向数组元素输入数值,/成员函数定义,找数组元素中的最大值,/定义对象arrmax,/调用arrmax的set_value函数,向数组元素输入数值,/调用arrmax的
15、max_value函数,找出数组元素中的最大值,/调用arrmax的show_value函数,输出数组元素中的最大值,/成员函数定义,输出最大值,2.类的封装性和信息隐蔽,公用接口与私有实现的分离 class Student private:int num;string name;char sex;public:void display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;Student stud;,被操作的数据是私有的,公用接口,int age;,(1)如果想修改或扩充类的功能,只需修改本类中有关的数据成员和与它有关的成员函数
16、,程序中类外的部分可以不必修改。,coutage:ageendl;,注意:虽然类中的数据成员改变了,成员函数display的定义改变了,但是类的对外接口没有改变,外界仍然通过公用的display函数访问类中的数据。程序中的其他任何部分均无需修改。,当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对私有实现的修改不会影响程序的其他部分。这种“类的公用接口与私有实现的分离”形成信息隐蔽。,(2)如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的少数成员函数。,2.类的封装性和信息隐蔽,类声明和成员函数定义的分离如果一个类被多个程序使用,一般做法是将类的声明
17、(其中包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,减少工作量,提高编程的效率。/student.h(这是头文件,在此文件中进行类的声明)class Student public:void display();private:int num;char name20;char sex;,/类声明,/公用成员函数原型声明,/student.cpp(在此文件中进行函数的定义)#include#include student.h void Studentdisplay()coutnum:numendl;coutname:name
18、endl;coutsex:sexendl;,/不要漏写此行,否则编译通不过,/在类外定义display类函数,实现信息隐蔽。,2.类的封装性和信息隐蔽,为了组成一个完整的源程序,还应当有包括主函数的源文件:/main.cpp 主函数模块#include#include student.h/将类声明头文件包含进来int main()Student stud;/定义对象 stud.display();/执行stud对象的display函数 return 0;,这是一个包括3个文件的程序,组成两个文件模块:一个是主模块main.cpp,一个是student.cpp。在主模块中又包含头文件studen
19、t.h。在预编译时会将头文件student.h中的内容取代#include student.h行。,2.类的封装性和信息隐蔽,注意:由于将头文件student.h放在用户当前目录中,因此在文件名两侧用双撇号包起来“student.h”)而不用尖括号(),C+编译系统对两个文件main.cpp和student.cpp分别进行编译,得到两个目标文件main.obj和tudent.obj,得到两个目标文件main.obj和tudent.obj,C+编译系统对两个文件main.cpp和student.cpp分别进行编译,2.类的封装性和信息隐蔽,在实际工作中,并不是将一个类声明做成一个头文件,而是将若
20、干个常用的功能相近的类声明集中在一起,形成类库。类库有两种:一种是C+编译系统提供的标准类库;一种是用户根据自己的需要做成的用户类库,提供给自己和自己授权的人使用,这称为自定义类库。类库包括两个组成部分:(1)类声明头文件;(2)已经过编译的成员函数的定义,它是目标文件。用户只需把类库装入到自己的计算机系统中(一般装到C+编译系统所在的子目录下),并在程序中用#include命令行将有关的类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数,顺利地运行程序。,全局作用域限定符“:”,#include;int X=1;void main()int X=2;cout X;,此时输出的X值是
21、为“1”还是“2”?输出:2因为系统采用同名覆盖原则。如何输出全局变量X的值?,相同吗?,C+中的全局作用域限定符,例题:全局作用域#include using namespace std;int X=1;void main()int X=2;cout local X=Xendl;/未限定时的符号名为局部符号名 cout“global X=”:Xendl;/采用“:”限定时的符号名为全局符号名,全局作用域限定符“:”的作用:能使程序员访问到在某外部块中所定义的全局变量,以免被同名的局部变量所覆盖。访问规则:(1)有“:”限定的同名符号是全局变量。(2)无“:”限定的同名符号是局部变量。,全局作
22、用域限定符的编程规则,:CreateWindow(参数);CreateWindow(参数);,全局作用域限定符“:”不仅可以限定变量,也可以用来限定函数。以Microsoft 公司的SDK API函数与VC+中的MFC类库中的成员函数同名为例说明,它为MFC CWnd类中的成员函数!,它为Windows API全局函数,C+程序设计,第3章 类和对象课后作业与上机练习题目,作业:,需要求3个长方柱的体积,请编写一个基于对象的程序。数据成员包括length(长)、width(宽)、height(高)。要求用成员函数实现以下功能:1、由键盘分别输入3个长方柱的长、宽、高;2、计算长方柱的体积;3、
23、输出3个长方柱体积;请编写程序,上机调试并运行。,本章作业,1.分析下列程序的输出结果(1)#include using namespace std;class Location public:void init(int i=0,int j=0);void setA(int n1)A=n1;void setB(int n2)B=n2;int getA()return A;int getB()return B;private:int A,B;,void Location:init(int i,int j)A=i;B=j;int main()Location X,Y;X.init(4);X.set
24、A(10);coutX.getA(),X.getB()endl;Y.init(7,9);Y.setB(8);coutY.getA(),Y.getB()endl;return 0;,本章作业,(2)下面的程序定义了一个Clock类,记录当前时间(小时和分钟),并可以通过两个函数取到这两个私有成员。主函数定义一个Clock对象,输出他的当前时间,然后将时间增加一分钟,再输出增加后的时间。写出程序运行结果。#include using namespace std;class clock int hour;int minute;public:clock(void);void inc_time(void
25、);int present_hour(void)return hour;int present_minute(void)return minute;void print_time();clock:clock(void)hour=6;minute=59;,本章作业,void clock:print_time(void)cout59)minute-=60;hour+;,int main()clock myclock;myclock.print_time();myclock.inc_time();myclock.print_time();myclock.inc_time();myclock.prin
26、t_time();return 0;,本章作业,2.设计Test类,使如下程序的输出结果为:测试结果:68-55=13int main()Test a;a.init(68,55);a.print();return 0;,本章作业,3.改错题(1)请用横线标出下面的程序错误语句所在行并说明出错原因。#include using namespace std;class A private:int a;public:void seta(int x)a=x;void showA()couta=aendl;,int main()A obj;obj.a=3;obj.seta(53);obj.showA()
27、;return 0;,本章作业,(2)请用横线标出下面的程序段错误语句所在行并说明出错原因。class Location int X,Y=20;private:int length,height;public:float radius;void init(int initX,int initY);int GetX();int GetY();,本章作业,4.填空题(1)在下面程序的横线处填上适当字句,使该程序执行结果为8。#include class Myclass int X;public:(1)/为X置值(2)/取X值;int main()Myclass test;test.init(8);
28、couttest.Getnum()endl;return 0;,本章作业,(2)在下面的类定义中,私有成员包括。classLocationintX,Y;protected:intW,Z;intSet(W,Z);private:intlength,height;public:voidinit(intx,inty);intGetX();intGetY();,本章作业,3.课后习题1.P261-12.P261-2,33.P261-4,5,上机练习题目,实验目的通过过上机练习学会类和对象的定义方法。了解下列各成员函数的特点:(1)内联(2)重载(3)设置默认参数,上机练习题目,(一)教材中例题程序的调试1.例8.12.例8.2(1)程序a(2)程序b(3)程序c3.例8.38.44.p258例题,上机练习题目,(二)课件中典型例题程序的调试1.计算两数之和。(两数之和2.cpp)2.例1.日期类的定义和应用(例1日期类.cpp.cpp)3.例8.3(例8_3.cpp)4.例4.使用类设计模拟数字式时钟的程序(例4模拟数字时钟.cpp),上机练习题目,(四)课后习题1.p216第23题2.p127第46题,