1、第 2 章 面向对象程序设计OOP 即面向对象程序设计;Object_Oriented Programming一、类与对象传统程序设计方法是面向过程,而现在是采用面向对象,如:C 就是采用结构化面向过程;其数据和处理数据的程序是分离的 C+是采用面向对象,是将数据和处理数据的函数封装到一个类中。而使用类数据变量则称为对象,在一个对象内,只有属于该对象的函数,才可以存取该对象的数据,其它函数是不能对它进行操作的,从而达到保护和隐藏的效果。1、面向过程:(1)采用自顶向下(2)分解若干个模块(3)设计数据结构(4)设计过程或函数2、新的程序设计范型:对象、类、继承、封装、消息等概念进行程序设计。例
2、如:1、用 C 编写的输出星号三角形程序#include DoDraw(int num) for(int i=0;iclass fun public:DoDraw(int num);fun:DoDraw(int num) for(int i=0;iclass CMeter public:double m_nPercent; /声明一个公有数据成员void Steplt(); /声明一个公有成员函数void SetPos(int nPos); /声明一个公有成员函数int GetPos() /声明一个公有成员函数 return m_nPos; /并定义(类内定义)int ff; /这里也不能直接
3、赋值 如:ff=0; 是错的private:int m_nPos;/声明一个私有数据成员,不能直接赋值 如:int m_nPos=1;是错的protected:int hh; /声明一个保护类型变量; void CMeter:Steplt() /成员函数的实现 m_nPos+; coutSetPos(1); /使 m_nPos 为 1for(int j=1;jSteplt(); /每次 m_nPos+1as.SetPos(1); /同上for(int i=1;iSteplt(),Meters0.Steplt(); myMeter 是类的对象,Steplt()是 myMeter 的成员函数注意:
4、类的指针应用应是:class CMeter public:Steplt();private:;CMeter *meter;CMeter *meter=new CMeter;meter-Steplt();例:类和对象的定义#include class CMeter public:double m_nPercent; /声明一个公有数据成员void Steplt(); /声明一个公有成员函数void SetPos(int nPos); /声明一个公有成员函数int GetPos() /声明一个公有成员函数 return m_nPos; /并定义int ff; /这里也不能直接赋值 如:ff=0;
5、是错的private:int m_nPos;/声明一个私有数据成员,不能直接赋值 如:int m_nPos=1;是错的protected:int hh; /声明一个保护类型变量; void CMeter:Steplt() /成员函数的实现 m_nPos+; coutSetPos(1); /使 m_nPos 为 1for(int j=1;jSteplt(); /每次 m_nPos+1as.SetPos(1); /同上for(int i=1;iclass Account private:double balance;public:Account(double init_balance) balan
6、ce=init_balance;coutgar(8);/1、构造函数名必须与类名相同/2、构造函数没有返回值类型,可以有任意类型的参数/3、声明类的对象时,系统自动调用构造函数,构造函数能显示调用/4、若在声明类时,未定义构造函数,系统自动生成默认不带参数的构造函数/ 默认构造函数是一个函数体为空的构造函数/5、构造函数可以重载;若在类定义了构造函数,则不再有默认的构造(四)对象成员的初始化前面所遇到的都是基本的类,但在实际应用中往往需要多个类,这时就可以把一个已定义的对象作为另一个类的成员,为了能对这些对象成员进行初始化,可用下面定义方法定义构造函数。:(形参表):对象 1(参数表) ,对象
7、 2(参数表) ,-对象n(参数表)注:对象 1,对象 2-对象 n 是其它类的对象,冒号“:”后面的列表称为成员初始化列表。例:对象成员的初始化(103)#include class CPoint/第一个类private:int nPosX,nPosY;public:CPoint(int x,int y) nPosX=x; nPosY=y; void ShowPos() coutclass CSumprivate:static int nSum;/声明静态数据成员public:CSum(int a=0,int b=0) nSum+=a+b; int GetSum() return nSum;
8、 void SetSum(int sum) nSum=sum; ;int CSum:nSum=0;/静态数据成员的初始化void main()CSum one(10,2);cout:= 见上例 2、静态成员函数/静态成员函数和静态数据成员一样,它们都属于类的静态成员,都不是对象成/员,因此,对静态成员的引用不需要用对象名。在静态成员函数的实现中不能/直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成/员函数中要引用非静态成员时,可以通过对象来引用。/例:静态数据成员的使用(105)#include class CSumprivate:static int nSum;/声明静态
9、数据成员public: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);/声明静态成员函数;void CSum:ShowData(CSum one)/静态成员函数的实现coutclass CPointprivate:unsigned m_x,m_y;public:CPoint() m_x=m_y=0; CPoint(unsigned x,unsigned y)m_x=x; m_y=y;void Prin
10、t() coutclass CPoint private:void Inflate(int nOffset);unsigned m_x,m_y;public:friend class COther;/声明 COther 类是 CPoint 类的友元类CPoint() m_x=m_y=0; CPoint(unsigned x,unsigned y) m_x=x;m_y=y; void Print(void) cout常指针和常引用往往用做函数的参数(形参) ,称常参数,使用常参数则表明该函数不会更新某个参数所指向或所引用的对象。如:例:常参数的函数传递(110)#include class CO
11、neprivate:public:void print(const int *p,int n)/使用常参数cout)constconst 是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带 const 关键字。例:常成员函数的使用(110)#include class COneprivate:int x,y;public:COne(int a,int b) x=a;y=b; void print();void print()const;/声明常成员函数;void COne:print()coutclass COneprivate:const int x;/常
12、数据成员static const int y;/静态常数据成员public:COne(int a):x(a),r(x)/常数据成员的初始化 void print();const int /引用类型的常数据成员;const int COne:y=10;/静态数据成员的初始化void COne:print()coutclass COneprivate:int x,y;public:COne() x=y=0; COne(int a,int b) x=a;y=b; void copy(COne /对象引用作为函数参数void print() coutclass CMeter private:int m
13、_nPos;public:CMeter(int nPos=10) m_nPos=nPos; CMeter() void StepIt() m_nPos+; int GetPos() return m_nPos; protected:void SetPos(int nPos) m_nPos=nPos; ;class CStick:public CMeter/从 CMeter 派生,公有继承int m_nStickNum;/声明一个私有数据成员public:void DispStick();/声明一个公有成员函数void SetStick(int nPos) SetPos(nPos);/类中调用基
14、类的保护成员 ;void CStick:DispStick()m_nStickNum=GetPos();/调用基类 CMeter 的成员函数coutclass CMeter public:CMeter(int nPos=10) m_nPos=nPos; CMeter() void StepLt() m_nPos+; int GetPos() return m_nPos; protected:void SetPos(int nPos) m_nPos=nPos; private:int m_nPos;class CStick:private CMeter/私有继承 int m_nStickNum;
15、/私有数据成员public:void DispStick();/公有成员函数void SetStick(int nPos) SetPos(nPos); /调用基类的保护成员int GetStick() return GetPos(); /调用基类的公有成员;void CStick:DispStick() m_nStickNum=GetPos();/调用基类 CMeter 的成员函数coutclass CShape public:virtual float area()/虚函数 return 0.0; ;class CTriangle:public CShape private:float H,
16、W;public:CTriangle(float h,float w) H=h; W=w; float area() return (float)(H*W*0.5); /派生类中重新定义,三角形面积;class CCircle:public CShape public:CCircle(float r) R=r; float area() return (float)(3.14159265*R*R); /派生类重新定义,圆的面积private:float R;void main() CShape *s2;s0=new CTriangle(3,4);/执行派生类的构造函数就将 3,4 赋给了 h,
17、wcoutarea()area()area()area()#include /可读可写头文件void main()fstream file1;/定义一个 fsteram 类的对象用于读file1.open(“Ex_DataFile.txt“,ios:in);/为输入打开一个文件,若文件/存在,不清除文件原有内容if(!file1)cout“Ex_DataFile.txt 不能打开!n“;return;fstream file2; /定义一个 fstream 类的对象用于写file2.open(“Ex_DataFileBak.txt“,ios:out|ios:trunc);/为输出打开/一个文件
18、和若文件存在清除文件原有内容if(!file2)cout“Ex_DataFileBak.txt 不能创建!n“;file1.close();return;char ch;while(!file1.eof() /直到文件尾 file1.read( /从 1 开始读coutchendl; /输出file2.write( /写到文件 2 里,从 1 开始while(!file2.eof()file2.read(coutchendl;file2.close();file1.close();/关闭 file1,file2 文件cout“n“;/eof 是 ios 类的成员函数,当达到文件的末尾时,它将返回真。 /注意:你要往该项目中的 Ex_DataFile 里写一些字符,那麽才能在结果中显示/出来 第 3 章结束