第C面向对象程序设计.ppt
《第C面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《第C面向对象程序设计.ppt(99页珍藏版)》请在三一办公上搜索。
1、第2章C+面向对象程序设计,在传统的结构化程序设计方法中,数据和处理数据的程序是分离的。当对某段程序进行修改或删除时,整个程序中所有与其相关的部分都要进行相应的修改,从而程序代码的维护比较困难。为了避免这种情况的发生,C+引用了面向对象的设计方法,它是将数据及处理数据的相应函数“封装”到一个“类”中,类的实例称为“对象”。在一个对象内,只有属于该对象的函数才可以存取该对象的数据。这样,其他函数就不会无意中破坏它的内容,从而达到保护和隐藏数据的效果。,2.1.1 类的定义,类的定义一般地分为声明部分和实现部分。声明部分是用来声明该类中的成员,包含数据成员(或称“成员变量”)的声明和成员函数的声明
2、。成员函数是用来对数据成员进行操作的,又称为“方法”。实现部分是用来对成员函数的定义。概括说来,声明部分将告诉使用者“干什么”,而实现部分是告诉使用者“怎么干”。C+中定义类的一般格式如下:class private:public:;其中,class是定义类的关键字,class的后面是用户定义的类名,通常用大写的C字母开始的标识符作为类名,C用来表示类(Class),以与对象、函数及其他数据类型相区别。类中的数据和函数是类的成员,分别称为数据成员和成员函数。,2.1.1 类的定义,定义类时还应注意:类中的数据成员的数据类型可以是任意的,但不允许对所定义的数据成员进行初始化,例如类CMeter中
3、,下面的定义是错误的:class CMeter.private:int m_nPos=10;/错误.;(2)在“public:”或“private:”后面定义的所有成员都是公有或私有的,直到下一个“public:”或“private:”出现为止。若成员前面没有类似“public:”或“private:”,则所定义的成员是private(私有),这是类的默认设置。(3)关键字public和private可以在类中出现多次,且前后的顺序没有关系;但最好先声明公有成员,后声明私有成员,因为public成员是用户最关心的。(4)除了public和private外,关键字protected(保护)也可修
4、饰成员的类型,它与private两者基本相似,但在类的继承时有所不同(后面还会讲到)。(5)数据成员的类型可以是任意的,包含整型、浮点型、字符型、数组、指针和引用等,也可以是另一个类的对象。(6)尽量将类单独存放在一个文件中或将类的声明放在.h文件中而将成员函数的实现放在与.h文件同名的.cpp文件中。以后将会看到,Visual C+6.0为用户创建的应用程序框架中都是将各个类以.h和同名的.cpp文件组织的。,2.1.2 对象的定义,一个类定义后,就可以定义该类的对象,如下面的格式:其中,类名是用户已定义过的类的标识符,对象名可以有一个或多个,多个时要用逗号分隔。被定义的对象既可以是一个普通
5、对象,也可以是一个数组对象或指针对象。例如:CMeter myMeter,*Meter,Meters2;这时,myMeter是类CMeter的一个普通对象,Meter和Meters分别是该类的一个指针对象和对象数组。一个对象的成员就是该对象的类所定义的数据成员(成员变量)和成员函数。访问对象的成员变量和成员函数和访问变量和函数的方法是一样的,只不过要在成员前面加上对象名和成员运算符“.”,其表示方式如下:.(),2.1.3 构造函数和析构函数,1.构造函数前面已提及,在类的定义中是不能对数据成员进行初始化的。为了能给数据成员自动设置某些初始值,这时就要使用类的特殊成员函数构造函数。构造函数的最
6、大特点是在对象建立时它会被自动执行,因此用于变量、对象的初始化代码一般放在构造函数中。C+规定:构造函数必须与相应的类同名,它可以带参数,也可以不带参数,与一般的成员函数定义相同,也可以重载。例如:class CMeterpublic:CMeter(int nPos)/带参数的构造函数 m_nPos=nPos;.这样若有:CMeter oMeter(10),oTick(20);则会自动调用构造函数CMeter(int nPos),从而使得对象oMeter中的私有成员m_nPos的值为10;使得对象oTick中的私有成员m_nPos的值为20。,2.1.3 构造函数和析构函数,2.析构函数与构造
7、函数相对应的是析构函数。析构函数是另一个特殊的C+成员函数,它只是在类名称前面加上一个“”符号。每一个类只有一个析构函数,没有任何参数,也不返回任何值。例如:class CMeter public:.CMeter()/析构函数.析构函数只有在下列两种情况下才会被自动调用:(1)当对象定义在一个函数体中,该函数调用结束后,析构函数被自动调用。(2)用new为对象分配动态内存,当使用delete释放对象时,析构函数被自动调用。,2.1.3 构造函数和析构函数,3.默认构造函数和析构函数系统自动生成的默认构造函数和析构函数如下所示:CMeter()/默认构造函数的形式 CMeter()/默认析构函数
8、的形式 需要说明的是,在用户定义一个对象时,编译器会自动根据对象定义的格式选择相应的构造函数。例如:CMeter m1,m2;由于m1和m2不带任何参数,当类没有用户定义的构造函数时,则编译器就会使用默认构造函数对m1和m2进行初始化。用默认构造函数对对象进行初始化时,则将对象的所有数据成员都初始化为零或空。,2.1.3 构造函数和析构函数,4.构造函数的重载构造函数可以被重载,C+会根据对象定义中的参数选择合适的构造函数。例如:例Ex_ConOverLoad 构造函数的重载#include class CDatepublic:CDate();CDate(int day);CDate(int
9、month,int day);CDate(int year,int month,int day);/其他公共成员private:int nYear,nMonth,nDay;CDate:CDate()nMonth=7;nDay=30;nYear=2002;coutnYear-nMonth-nDayendl;CDate:CDate(int day),nMonth=7;nDay=day;nYear=2002;coutnYear-nMonth-nDayendl;CDate:CDate(int month,int day)nMonth=month;nDay=day;nYear=2002;coutnYea
10、r-nMonth-nDayendl;CDate:CDate(int year,int month,int day)nYear=year;nMonth=month;nDay=day;coutnYear-nMonth-nDayendl;void main()CDate day1;CDate day2(28);CDate day3(8,1);CDate day4(2003,3,10);运行结果为:,2.1.3 构造函数和析构函数,例Ex_ConDefault 带默认参数的构造函数#include class CDate public:CDate(int year=2002,int month=7,i
11、nt day=30)nYear=year;nMonth=month;nDay=day;coutnYear-nMonth-nDayendl;/其他公共成员 private:int nYear,nMonth,nDay;void main()CDate day1;CDate day2(2002,8);运行结果为:,2.1.3 构造函数和析构函数,5.拷贝构造函数拷贝构造函数是一种特殊的成员函数,它的功能是用一个已知的对象来初始化一个被创建的同类的对象。拷贝构造函数的函数名与构造函数一样,也是它所属类的类名。不过与一般的构造函数有一点不同,即它只有一个参数,且参数是同类的一个对象的引用。定义一个拷贝构
12、造函数的一般形式如下::(const&)其中,const是一个类型修饰符,被它修饰的对象是一个不能被更新的常量。例如:,2.1.3 构造函数和析构函数,例Ex_ConCopy 拷贝构造函数的使用#include class CDatepublic:CDate(int year=2002,int month=7,int day=30)cout调用构造函数endl;nYear=year;nMonth=month;nDay=day;coutnYear-nMonth-nDayendl;CDate(const CDate,2.1.3 构造函数和析构函数,例Ex_ConCopy 拷贝构造函数的使用运行结果
13、为:,2.1.3 构造函数和析构函数,5.拷贝构造函数实际上,如果类中没有声明拷贝构造函数,则编译器自动生成一个默认的拷贝构造函数。例如:例Ex_ConCopyDefault 默认拷贝构造函数的使用#include class CDatepublic:CDate(int year=2002,int month=7,int day=30)cout调用构造函数endl;nYear=year;nMonth=month;nDay=day;void output()coutnYear-nMonth-nDayendl;private:int nYear,nMonth,nDay;void main()CDa
14、te day1(2002,8);CDate day2(day1);/调用默认的拷贝函数day1.output();day2.output();,2.1.3 构造函数和析构函数,例Ex_ConCopyDefault 默认拷贝构造函数的使用运行结果为:,2.1.4 对象成员初始化,前面所遇到的都是单独的一个类,但在实际应用中往往需要多个类,这时就可能把一个已定义类的对象作为另一个类的成员。为了能对这些对象成员进行初始化,C+允许采用这样的构造函数定义格式::(形参表):对象1(参数表),对象2(参数表),对象n(参数表)其中,对象1、对象2、对象n就是该类使用的其他类的对象,冒号“:”后面的列表称
15、为成员初始化列表。下面来看一个示例:,2.1.4 对象成员初始化,例Ex_InitMultObject 对象成员的初始化#include class CPoint public:CPoint(int x,int y)nPosX=x;nPosY=y;void ShowPos()cout当前位置:x=nPosX,y=nPosYendl;private:int nPosX,nPosY;class CSize public:CSize(int l,int w)nLength=l;nWidth=w;void ShowSize()cout当前大小:l=nLength,w=nWidthendl;privat
16、e:int nLength,nWidth;,class CRectpublic:CRect(int left,int top,int right,int bottom):size(right-left,bottom-top),ptCenter(left+right)/2,(top+bottom)/2)void Show()ptCenter.ShowPos();size.ShowSize();private:CPoint ptCenter;CSize size;void main()CRect rc(10,100,80,250);rc.Show();运行结果为:,代码中,声明类CRect的构造函
17、数时,将成员CPoint类对象ptCenter和CSize类对象size按CRect构造函数的形参进行初始化。,2.1.5 静态成员,静态成员的提出是为了解决数据共享的问题。1.静态数据成员它是这样定义的:(1)使用关键字static声明静态数据成员。(2)对静态数据成员进行初始化。由于静态数据成员要实际在分配空间,因此不能在类声明中进行初始化。静态数据成员初始化在类的外部进行,且与一般数据成员初始化不同,它的格式如下::=例如:,2.1.5 静态成员,例Ex_StaticData 静态数据成员的使用#include class CSumpublic:CSum(int a=0,int b=0)
18、nSum+=a+b;int GetSum()return nSum;void SetSum(int sum)nSum=sum;private:static int nSum;/声明静态数据成员;int CSum:nSum=0;/静态数据成员的初始化void main()CSum one(10,2),two;coutsum=one.GetSum()endl;one.SetSum(5);coutsum=one.GetSum()endl;coutsum=two.GetSum()endl;运行结果为:,2.1.5 静态成员,2.静态成员函数例Ex_StaticFunc 静态成员函数的使用#includ
19、e class CSumpublic:CSum(int a=0,int b=0)nSum+=a+b;int GetSum()return nSum;void SetSum(int sum)nSum=sum;static void ShowData(CSum one);/声明静态成员函数private:static int nSum;void CSum:ShowData(CSum one)/静态成员函数的实现cout直接使用静态成员endl;coutsum=nSumendl;cout使用同类的对象endl;coutsum=one.GetSum()endl;,int CSum:nSum=0;voi
20、d main()CSum one(10,2);CSum:ShowData(one);/直接访问one.SetSum(8);one.ShowData(one);/通过对象访问运行结果为:,2.1.6 友元,例Ex_FriendFunc 友元函数的使用#include class CPoint public:CPoint()m_x=m_y=0;CPoint(unsigned x,unsigned y)m_x=x;m_y=y;void Print()cout Point(m_x,m_y)endl;friend CPoint Inflate(CPoint/直接改变私有数据成员m_x和m_y,ptTem
21、p.m_y+=nOffset;return ptTemp;void main()CPoint pt(10,20);pt.Print();pt=Inflate(pt,3);/调用友元函数 pt.Print();运行结果为:,2.1.7 常类型,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。1.常对象常对象是指对象常量,定义格式如下:const 定义常对象时,修饰符const可以放在类名后面,也可以放在类名前面。例如:class COne public:COne(int a,int b)x=a;y=b;private:i
22、nt x,y;const COne a(3,4);COne const b(5,6);其中,a和b都是COne对象常量,初始化后就不能再被更新。,2.1.7 常类型,2.常指针和常引用常指针也是使用关键字const来修饰的。但需要说明的是,const的位置不同,其含意也不同,它有三种形式。第一种形式是将const放在指针变量的类型之前,表示声明一个指向常量的指针。此时,在程序中不能通过指针来改变它所指向的数据值,但可以改变指针本身的值。例如:int a=1,b=2;const int*p1=/错误,2.1.7 常类型,例Ex_ConstPara 常参数的函数传递#include class C
23、Onepublic:void print(const int*p,int n)/使用常参数 cout*p;for(int i=1;in;i+)cout,*(p+i);coutendl;void main()int array6=1,2,3,4,5,6;COne one;one.print(array,6);运行结果为:,2.1.7 常类型,3.常成员函数使用const关键字进行声明的成员函数,称为“常成员函数”。只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说明格式如下:()const;其中,const是加在函数说明后面的类型修饰符
24、,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字。例如:,2.1.7 常类型,例Ex_ConstFunc 常成员函数的使用#include class COnepublic:COne(int a,int b)x=a;y=b;void print();void print()const;/声明常成员函数private:int x,y;void COne:print()coutx,yendl;void COne:print()const cout使用常成员函数:x,yendl;void main()COne one(5,4);one.print();const COne t
25、wo(20,52);two.print();运行结果为:,程序中,类COne声明了两个重载成员函数,一个带const,一个不带。语句“one.print();”调用成员函数“void print();”,而“two.print();”调用常成员函数“void print()const;”。,2.1.7 常类型,4.常数据成员类型修饰符const不仅可以说明成员函数,也可以说明数据成员。由于const类型对象必须被初始化,并且不能更新,此,在类中声明了const数据成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。例如:例Ex_ConstData 常数据成员的使用#includ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-4873534.html