1、C+程序设计基础程序设计基础主讲人:曹岳辉类的定义类的定义 对象的定义对象的定义 对象的初始化对象的初始化 成员函数的特性成员函数的特性 静态成员静态成员 友元友元 局部类和嵌套类局部类和嵌套类 面向对象面向对象的基本概念的基本概念 类的定义格式类的定义格式 注意事项注意事项客观世界中任何一个事物都可以看成一个对象(object)。对象可大可小。对象是构成系统的基本单位。任何对象都具两个要素,即属性(attributeattribute)和行为(behaviorbehavior)它能根据外界给的信息进行相应的操作。一个对象往往是由一组属性和一组行为构成的。在一个系统中的多个对象之间通过一定的渠
2、道相互联系。要使某一个对象实现某一种行为(即操作),应当向它传送相应的消息。对象之间就是这样通过发送和接收消息互相联系的1.C+,每个对象都是由和 两部分组成。体现了前面提到的“属性”。如一个三角形对象,它的3个边长就是它的属性。是用来对数据进行操作的,以便实现某些功能(即行为)。例如可以通过边长计算出三角形的面积等,计算三角形面积就是前面提到的行为,在程序设计方法中也称为方法(method)。4.调用对象中的函数就是向该对象传送一个消息(message),要求该对象实现某一行为(功能)。对一个对象进行封装处理,把它的一部分属性和功能对外界屏蔽,也就是说从外界是看不到的,甚至是不可知的。其好处
3、是大大降低了操作对象的复杂程度。一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐蔽(information hiding)。信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。抽象(abstraction)就是将有关事物的共性归纳、集中的过程。抽象的作用是表示同一类事物的本质。C+中的数据类型就是对一批具体的数的抽象。对象是具体存在的,类是对象的抽象;对象则是类的特例,或者说对象是类的具体表现形式。(如一个三角形可以作为一
4、个对象,10个不同尺寸的三角形是10个对象。如果这10个三角形对象有相同的属性和行为,可以将它们抽象为一种类型,称为三角形类型。在C+中,这种类型就称为“类(class)”。这10个三角形就是属于同一“类”的对象。)如果在软件开发中已经建立了一个名为A的“类”,又想另外建立一个名为B的“类”,而后者与前者内容基本相同,只是在前者的基础上增加一些属性和行为,只需在类A的基础上增加一些新内容即可。这就是面向对象程序设计中的继承机制。利用继承可以简化程序设计的步骤。()C+提供了继承机制,采用继承的方法可以很方便地利用一个已有的类建立一个新的类。这就是常说的“软件重用”(software reusa
5、bility)的思想。如果有几个相似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作,这就是多态现象。(在Windows下,用鼠标双击一个文件对象(这就是向对象传送一个消息),如果对象是一个可执行文件,则会执行此程序,如果对象是一个文本文件,则启动文本编辑器并打开该文件。)多态性多态性(polymorphism)是指:由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。所有的数据都是公用的,一个函数可以使用任何一
6、组数据,而一组数据又能被多个函数所使用。面向对象程序设计的特点面向对象程序设计的特点面向对象程序设计面对的是一个个对象。其中每一组数据都是有特定的用途的,是某种操作的对象。也就是说,一组操作调用一组数据。程序设计者的任务包括:一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需的任务。对一个大型任务来说,面向对象程序设计方法是十分有效的,它能大大降低程序设计人员的工作难度,减少出错机会。面向对象的程序设计是以类和对象为基础的,程序的操作是围绕对象进行的,在此基础上利用了继承机制和多态性等。面向过程的结构化程序设计中,常用以下公式来表述程序:程
7、序程序=算法数据结构算法数据结构面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中。因此就形成了新的观念:对象=算法 数据结构程序=(对象+对象+对象+)+消息 或:程序=对象s+消息随着软件规模的迅速增大,软件人员面临的问题十分复杂。需要规范整个软件开发过程,明确软件开发过程中每个阶段的任务,在保证前一个阶段工作的正确性的情况下,再进行下一阶段的工作。这就是软件工程学需要研究和解决的问题。面向对象的软件工程包括以下几个部分:1.1.面向对象分析面向对象分析(object oriented analysis,OOA)object oriented analysis,OOA)软件工程中
8、的系统分析阶段,系统分析员要和用户结合在一起,对用户的需求作出精确的分析和明确的描述,从宏观的角度概括出系统应该做什么(而不是怎么做)。面向对象的分析,要按照面向对象的概念和方法,在对任务的分析中,从客观存在的事物和事物之间的关系,归纳出有关的对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个类(class)来表示。建立一个能反映真实工作情况的需求模型。2.2.面向对象设计面向对象设计(object oriented design,OOD)object oriented design,OOD)根据面向对象分析阶段形成的需求模型,对每一部分分别进行具体的设计。首先
9、是进行类的设计,类的设计可能包含多个层次(利用继承与派生)。然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。在设计阶段,并不牵涉某一种具体的计算机语言,而是用一种更通用的描述工具(如伪代码或流程图)来描述。3.3.面向对象编程(面向对象编程(OOPOOP)用一种计算机语言把它写成程序,显然应当选用面向对象的计算机语言(例如C+),否则无法实现面向对象设计的要求。4.4.面向对象测试面向对象测试(object oriented object oriented test,OOTtest,OOT)在写好程序后交给用户使用前,必须对程序进行严格的测试。测试的目的是发现程序中的错误并改正它
10、。面向对象测试是用面向对象的方法进行测试,以类作为测试的基本单元。类的定义格式一般分为说明部分和实现部分。说明部分:是用来说明类中的成员,包含数据成员的说明和成员函数的说明。成员函数是用来对数据成员进行操作的,也称为“方法”。实现部分:是用来对成员函数进行定义。说明部分的一般格式为:class 类类型名类类型名 private:私有成员说明私有成员说明 public:公有成员说明公有成员说明 ;程序中的任何函数都可访问私有访问权限,为默认值,可缺省除本类中的成员函数及友元外,其他类外函数不能访问。公有访问权限class class TpersonTperson private:private:
11、char name10;char name10;intint age;age;char sex;char sex;public:public:void print();void print();成员函数的说明形式与一般函数的说明形式一致数据成员的说明形式与变量的定义形式相似类名通常用T字母开始,以区别其他标识符类的实现部分即定义它的成员函数,方式与定义普通函数大体相同。若在类说明外部定义成员函数,则应使用作用域限定符:指明该函数是哪个类中的成员函数。格式为:类型 类名:成员函数名(参数表)函数体如:void void Tperson:printTperson:print()()coutcout
12、nameagesex nameagesex endlendl;除特殊指明外,成员函数操作的是同一对象中的数据成员。其中如name等。若在成员函数中调用非成员函数(没有类名的函数;全局函数),则可用不带类名的:来表示。class TDate public:void Set(int m,int d,int y)/置日期值 month=m;day=d;year=y;void Print();/打印输出 private:int month;int day;int year;由于类名是成员函数名的一部分,所以一个类的成员函数与另一个类的成员函数可同名若将内联成员函数定义在类说明之外则要加上inline。
13、内联成员函数注注 意意class class TDateTDate public:public:private:private:intint year(1998),month(4);year(1998),month(4);;错误class TPoint public:void SetPoint(int x,int y)/置坐标值 X=x;Y=y;/给数据成员赋值 int Xcoord()return X;/提供X坐标值 int Ycoord()return Y;/提供Y坐标值 void Move(int xOffset,int yOffset);/移动点 private:int X;int Y
14、;void Tpoint:Move(int xOffset,int yOffset)X+=xOffset;Y+=yOffset;类体外成员函数的定义内联成员函数的定义私有数据成员的定义对象的定义格式对象的定义格式 对象成员的表示方法对象成员的表示方法 student s,t;/定义两个student类的对象s和t Tdate date1;/定义一个Tdate类的对象date1 Tdate*Pdate=&date1;/定义一个指向date1对象空间的指针Pdate Tdate data3;/定义一个data对象数组,其元素类型为Tdate类date1Set()Print()monthdayyea
15、rTdate date1;Tdate*Pdate=&date1;/指针指向对象date1类和对象关系如同整型类和对象关系如同整型 int 与整型变量与整型变量 i 之间的关系。之间的关系。注意:在成员函数中访问成员无须加对象名来作为前缀。如:void void Tperson:printTperson:print()/()/自家人不客气自家人不客气 coutcoutnameagesexnameagesexWin32 Console Appliciation-C/C+Header File;2、输入头文件内容并保存;3、New-C+Source File,输入程序内容并保存;4、编译、构建、执行
16、也可以先建立程序文件,编辑后再建立头文件,并将它加入工程即可!注意:程序与头文件要在同一目录!程序与头文件要在同一目录!这也是前面的程序中可以没有构造和析构函数的原因函数体内无代码,也可自定义一个无参的构造函数来替代缺省 CExample public:CExample();CExample(int i);CExample(int x,int y);private:int member1,member2;CExample:CExample()member1=0;member2=0;CExample:CExample(int i)member1=i;member2=0;自定义无参构造函数重载构造
17、函数注:若有构造注:若有构造函数的重载,函数的重载,则不会生成缺则不会生成缺省构造函数,省构造函数,须自定义无参须自定义无参构造函数!构造函数!CExample(int i=8);可否?可否?对应调用相应的构造函数不带参数创建对象,调用无参构造函数CExample:CExample(int x,int y)member1=x;member2=y;void main()CExample ex1;CExample ex2(1);CExample ex3(2,3);函数名同类名只有一个引用参数配钥匙class CMyClass public:CMyClass(int x=0);CMyClass(CM
18、yClass&c);/private:int member;;CMyClass:CMyClass(int x)member=x;CMyClass:CMyClass(CMyClass&c)member=c.member;拷贝初始化构造函数带缺省值的构造函数调用拷贝初始化构造函数调用带缺省值的构造函数调用带缺省值的构造函数结果为:结果为:a.member:0a.member:0b.member:3b.member:3c.member:3c.member:3funfun中的形参中的形参a a中的数据成员中的数据成员a.member:3a.member:3调用拷贝初始化构造函数class CPoint
19、 float x,y;/未指明的是未指明的是private public:CPoint(float a,float b);CPoint Add(CPoint A);CPoint :CPoint(float a,float b)x=a;y=b;CPoint:Add(CPoint A)CPoint B;B.x=x+A.x;B.y=y+A.y;return B;内联函数和外联函数内联函数和外联函数 成员函数的重载性成员函数的重载性 设置参数的缺省值设置参数的缺省值内联函数:指定义在类体内的成员函数。外联函数:指说明在类体内,定义在类体外的成员函数。类外定义的函数缺省情况下都是外联函数,用关键字 in
20、line 可以强制转换。对于内联函数,不是在调用时才转去执行函数体,而是在编译时对所有调用该函数的地方装入实际的函数代码。节省了调用开销,提高了运行速度。内联函数必须在调用之前进行定义。C+会根据说明中的参数选择合适的重载函数。class CRectangle/缺省参数按缺省参数按从右往左从右往左的方式的方式 CRectangle(int Width=10,int Height=5);/;静态数据成员静态数据成员 静态成员函数静态成员函数静态成员是在编译时被创建,其空间只有一个,且与对象是否存在无关,可为所有以后创建的该类对象共享。并且空间一直保存到程序结束。若想在同一个类的多个对象之间共享某
21、个数据。可将该类成员声明为staticstatic,使之成为静态成员。而一般成员是在对象创建时由构造函数分配空间,属于具体的某个对象,对象不同则成员空间也不同,并在函数结束时由析构函数释放对象空间而随之释放。例如:一个学生类,有一个对应学生总数属性的数据成员count。则对于每一个已有学生对象而言,一旦现有学生人数变化,那么已有学生对象中count所保存的数据就不适用,则要对每个对象逐个修改,显然这是不实际的。而应采用静态成员。成员有数据成员和成员函数之分,静态成员也有静静态成员也有静态数据成员和静态成员函数之分。态数据成员和静态成员函数之分。静态数据成员的定义同一般的成员函数的定义相似,由说
22、明部分和定义部分两部分组成:说明部分为:static 数据类型 成员名;定义部分为:数据类型 类名:成员名=初始值;如:class CTest public:static int count;/说明部分在类体内 ;int CTest:count=0;/定义部分在类体外 注意:必须在定义时进行初始化。在public中,可被类外函数引用,若在private中,则只能被成员函数或友元引用void main()CTest a,b;a.Set(10);cout Operating on a:;a.Display();b.Set(10);cout Operating on b:;b.Display();c
23、out Operating on a:;a.Display();运行结果:Operating on a:count=10Operating on b:count=20Operating on a:count=20在同类的成员函数中引用,可省略类名:CTest:count静态成员声明静态成员定义引用静态数据成员引用非静态成员引用静态成员函数class student public:static int number()return noofstudents;private:char name 10;static int noofstudents;int student:noofstudents=
24、1;void main()student s;coutstudent:number()endl;例如:例如:友元函数友元函数 友元类友元类友元为外部的独立函数友元为另一个类的成员函数 局部类局部类 嵌套类嵌套类int a;void fun()static int s;class A public:void initialize(int i)s=i;A m;m.initialize(10);class A public:class B public:/不能引用A中私有成员 private:;void f();/不能引用B中私有成员 private:int a;#include using nam
25、espace std;class Array_max /声明类 public:/以下3行为成员函数原型声明 void set_value();/对数组元素设置值 void max_value();/找出数组中的最大元素 void show_value();/输出最大值 private:int array10;/整型数组 int max;/max用来存放最大值;用类来实现找出一个整型数组中的元素的最大值用类来实现找出一个整型数组中的元素的最大值void Array_max set_value()int i;for(i=0;iarrayi;void Array_max max_value()int
26、 i;max=array0;for(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;用类来实现找出一个整型数组中的元素的最大值用类来实现找出一个整型数组中的元素的最大值学生有(num、name、score3)等信息,用类来编写程序,要求:1、能进行学生信息的初始化;2、能实现n个学生数据的输入;3、能自动计算学生的平均成绩;4、可打印学生的上述信息;5、找到成绩最好的学生并输出其信息;6、能求出每门课程的平均分数。分析:1、定义一个学生类,其中有num、name、score3、average,作为私有成员2、设计构造函数来作初始化,设计一个输入及打印函数、还想设计一个计算学生平均分的函数,作为公有成员函数等信息,用类来编写程序,要求:3、主程序中,通过循环来找到成绩最好的学生,并调用对象中的打印函数输出其信息;4、在主程序中,求出每门课程的平均分数,并输出。Chapter6_1.cpp