C++实用教程[郑阿奇主编]

上传人:小**** 文档编号:240743315 上传时间:2024-05-04 格式:PPT 页数:35 大小:397KB
返回 下载 相关 举报
C++实用教程[郑阿奇主编]_第1页
第1页 / 共35页
C++实用教程[郑阿奇主编]_第2页
第2页 / 共35页
C++实用教程[郑阿奇主编]_第3页
第3页 / 共35页
点击查看更多>>
资源描述
第10章 类 和 对 象10.1 类和对象概述 n10.1.1 从结构到类n 例例Ex_StructToClass 从结构到类的示例。从结构到类的示例。n#include nusing namespace std;nstruct STUSCORE nncharstrName12;/姓名ncharstrStuNO9;/学号nfloatfScore3;/三门课程成绩n;nfloat GetAverage(STUSCORE one)/计算平均成绩nnreturn(float)(one.fScore0+one.fScore1+one.fScore2)/3.0);nnint main()nnSTUSCORE one=LiMing,21020501,80,90,65;ncoutone.strName 的平均成绩为:GetAverage(one)n;nreturn 0;nn程序运行结果如下:LiMing的平均成绩为:78.333310.1.2 类的声明n1.类声明的格式nC+中,声明类的一般格式如下:nclass /声明部分nnprivate:nnpublic:nnprotected:nn;n/实现部分n成员函数的定义格式如下:n :()nnn例Ex_StuScoreClass 一个类的定义示例。n#include nusing namespace std;nclass CStuscore nnpublic:nfloat Average(void);/求平均成绩:在类中声明nchar*getName()/获取姓名:声明和定义同时在类中完成nnreturn strName;nnchar*getNo()/获取学号:声明和定义同时在类中完成nnreturn strStuNO;nnprivate:ncharstrName12;/姓名ncharstrStuNO9;/学号nprivate:nfloatfScore3;/三门课程成绩n;nfloat CStuscore:Average(void)/在类体外部定义nnreturn(float)(fScore0+fScore1+fScore2)/3.0);nnint main()nnreturn 0;nn2.几点说明n1)类中数据成员的数据类型可以是任意的,如整型、浮点型、字符型、数组、指针和引用等,也可以是另一个类的对象。n2)由于类是一种数据类型,系统并不会为其分配内存空间,所以在定义类的数据成员时,不能对其初始化,也不能指定除static之外的任何存储类型。n(3)访问权限关键词public、private、protected在类中使用时先后次序无关紧要,且可使用多次。每个访问权限关键词为类成员所确定的访问权限是从该关键词开始到下一个关键词为止。n(4)在进行类设计时,通常将数据成员声明为私有的,而将大多数成员函数声明为公有的。n5)一般来说,程序员更多关心公有成员,因此常将公有成员写在类体的前面,而将私有成员写在类体的后面。n(6)当程序比较大时,应尽量将类单独存放在一个文件中或将类的声明放在头文件中,而将成员函数的实现放在与头文件同名的.cpp文件中。n3.类和结构的区别10.1.3 对象的定义和成员的访问n1.对象的定义方式n并按下列格式定义:n ;n2.对象成员的访问 n.n.()n若对象是一个指针,则对象的成员访问形式如下:n-n-()n下面的两种表示是等价的:n-n(*).10.1.4 类作用域和成员访问权限n1.类名的作用域n下列格式在使用前提前声明:nclass;n2.类中成员的可见性n3.在类外对象成员的可见性n4.在类中对象成员的可见性例例Ex_Class 一个类和对象使用的示例。一个类和对象使用的示例。n#include n#include nusing namespace std;nclass CStuscore nnpublic:nfloat Average(void);nvoid Print(void)ncout姓名:strNameendl;ncout学号:strStuNOendl;ncout课程成绩:fScore0tfScore1tfScore2endl;ncout平均成绩:aveendl;nnvoid Print(CStuscore one)ncout姓名:one.strNameendl;ncout学号:one.strStuNOendl;ncout课程成绩:one.fScore0tone.fScore1tone.fScore2endl;ncout平均成绩:one.aveendl;nnvoid setName(char*str)/设置姓名nstrncpy(strName,str,11);/最多拷贝11个字符nnvoid setNo(char*str)/设置学号nnstrncpy(strStuNO,str,9);/最多拷贝9个字符nnvoid setScore(float s1,float s2,float s3)/设置成绩nnfScore0=s1;fScore1=s2;fScore2=s3;nnprivate:ncharstrName12;/姓名ncharstrStuNO9;/学号nprivate:nfloatfScore3;/三门课程成绩nfloat ave;/平均成绩n;nfloat CStuscore:Average()/计算平均成绩nnave=(float)(fScore0+fScore1+fScore2)/3.0);nreturn ave;nnint main()nnCStuscore one;none.setName(DING);none.setNo(21010301);none.setScore(90,80,78);none.Average();none.Print(one);nreturn 0;nn程序运行结果如下:10.2 构造函数和析构函数 n10.2.1 构造函数 n1.对象的初始化过程n2.构造函数n例Ex_Constructor 设计类的构造函数示例。n#include nusing namespace std;nclass CPersonnnpublic:nCPerson(char*str,float h,float w)/A:构造函数nnstrcpy(name,str);height=h;weight=w;n nCPerson(char*str)/B:构造函数nnstrcpy(name,str);nnCPerson(float h,float w=120);/C:构造函数npublic:nvoid print()nncout姓名:namet身高:heightt体重:weightendl;nnprivate:nchar name20;/姓名nfloat height;/身高nfloat weight;/体重n;nCPerson:CPerson(float h,float w)nnheight=h;weight=w;nnint main()nnCPerson one(DING);none.print();nCPerson two(170,130);ntwo.print();nCPerson three(DING,170,130);nthree.print();nreturn 0;nn程序运行结果如下:10.2.2 析构函数n其格式如下:n ()n n10.2.3 new和delete10.3 对象的使用10.3.1 对象赋值和拷贝n1.对象赋值nC+还常用下列形式的初始化来将另一个对象作为对象的初值:n()n2.分析和比较nCName的数据成员strName是一个“char*”指针,由于其自身的内存空间存放的是指针的地址,因而其数据的存储还需另辟一个不依附外部的独立的内存空间。n解决CName对象初始化中的内容拷贝问题,在C+中有两种手段,一是给“=”运算符赋予新的操作,称为运算符重载(以后会讨论);二是重新定义或重载默认拷贝构造函数。10.3.2 浅拷贝和深拷贝n1.浅拷贝n2.深拷贝n3.拷贝构造函数的格式n拷贝构造函数是一种特殊的构造函数,除遵循构造函数的声明和实现规则外,还应按下列格式定义:(参数表)例Ex_CopyCon 使用拷贝构造函数示例。n#include n#include nusing namespace std;nclass CNamennpublic:nCName()nnstrName=NULL;nnCName(char*str)nnstrName=(char*)new charstrlen(str)+1;nstrcpy(strName,str);/拷贝内容n nCName(CName&one)/A:显式的默认拷贝构造函数n/为strName开辟独立的内存空间nstrName=(char*)new charstrlen(one.strName)+1;nstrcpy(strName,one.strName);/拷贝内容nnCName(CName&one,char*add)/B:带其他参数的拷贝构造函数n/为strName开辟独立的内存空间nstrName=(char*)new charstrlen(one.strName)+strlen(add)+1;nstrcpy(strName,one.strName);/拷贝内容nstrcat(strName,add);/连接到strName中nnCName()nnif(strName)delete strName;nstrName=NULL;/一个好习惯nnchar*getName()nnreturn strName;nnprivate:nchar*strName;/字符指针,名称n;nint main()nnCName o1(DING);/通过构造函数初始化nCName o2(o1);/通过显式的默认拷贝构造函数来初始化ncouto2.getName()endl;nCName o3(o1,YOU HE);/通过带其他参数的拷贝构造函数来初始化ncouto3.getName()endl;nreturn 0;nn程序运行结果如下:n4.对象作为函数的参数和返回值10.3.3 对象成员的初始化n如下列格式:n:(形参表):对象1(参数表),对象2(参数表),对象n(参数表)n n1.分析和比较n类的对象成员的初始化可以有两种方式:n第1种方式(函数构造方式)n第2种方式(对象成员列表方式)例Ex_InitMultiObject 对象成员的初始化示例 n#include nusing namespace std;nclass CPoint nnpublic:nCPoint(int x=0,int y=0)n nnPosX=x;nPosY=y;nif(0=x)&(0=y)ncoutCPoint默认构造函数endl;nelsencoutCPoint构造函数endl;nnCPoint(const CPoint&one)nnnPosX=one.nPosX;nPosY=one.nPosY;ncoutCPoint默认拷贝构造函数endl;nnCPoint()ncoutCPoint析构函数endl;public:int nPosX,nPosY;/为简化代码,将这里的数据成员定义成公有型;class CSize public:CSize(int l=0,int w=0)nLength=l;nWidth=w;if(0=l)&(0=w)coutCSize默认构造函数endl;elsecoutCSize构造函数endl;CSize(CPoint pt1,CPoint pt2)nLength=pt2.nPosX-pt1.nPosX;nWidth=pt2.nPosY-pt1.nPosY;coutCSize(CPoint,CPoint)构造函数endl;CSize(const CSize&one)nLength=one.nLength;nWidth=one.nWidth;coutCSize默认拷贝构造函数endl;CSize()coutCSize析构函数endl;public:int nLength,nWidth;/为简化代码,将这里的数据成员定义成公有型;class CRectpublic:CRect(int left,int top,int right,int bottom):ptLT(left,top),ptRB(right,bottom),size(ptLT,ptRB),nLength(size.nLength)nWidth=size.nWidth;coutCRect构造函数endl;CRect()coutCRect析构函数endl;void show()cout-endl;coutsize:size.nLength,size.nWidthendl;coutptLT:ptLT.nPosX,ptLT.nPosYendl;coutptRB:ptRB.nPosX,ptRB.nPosYendl;coutnLength:nLength,nWidth:nWidthendl;cout-endl;private:CPoint ptLT,ptRB;CSize size;int nLength,nWidth;int main()CRect rc(10,100,80,250);rc.show();return 0;程序运行结果如下:事实上,“CRect rc(10,100,80,250);”的构造过程可用图来描述(图中括号中的数字与分析步骤相对应)。n3.几点说明n(1)对象成员必须初始化,且应尽量选择由冒号“:”引导的对象初始化列表的初始化方式,以提高对象初始化效率。n(2)对象成员初始化时,必须有相应的构造函数,且多个对象成员的构造次序不是按初始化成员列表的顺序,也不是按各个类的声明的先后顺序,而是按对象成员在类中声明的顺序进行。n(3)对象成员初始化也可在类的外部进行,但必须与构造函数的定义在一起。n(4)成员初始化列表也可用于类中的普通数据成员的初始化,但要注意其初始化格式。n例如:nCRect(int left,int top,int right,int bottom)n:ptLT(left,top),ptRB(right,bottom),nsize(ptLT,ptRB),nnLength(size.nLength)/注意:不能是nLength=size.nLengthn/n10.3.4 const对象 n常对象的定义格式如下:const(初值)nconst (初值)10.3.5 对象的生存期n对象可分为如下三种:对象可分为如下三种:n(1)局部对象。)局部对象。n(2)静态对象。)静态对象。n(3)全局对象。)全局对象。10.4 综合应用实例n1.栈模型n栈有两种操作:npush(压入)与pop(弹出)。例Ex_Stack10 设计栈类来存取学生成绩数据。n#include n#include n#include nusing namespace std;nclass CStuScoren;nclass CStacknnpublic:nCStack(int nSize=10);/构造函数nCStack();/析构函数npublic:/操作nvoidpush(CStuScore a);/压入anCStuScorepop(void);/弹出nprivate:nCStuScore*sp;/栈顶指针nCStuScore*buffer;/栈空间nintm_nSize;/栈大小n;nint main()nnCStack one(5);/创建大小为5个学生成绩对象的栈nCStuScore stu;nstu.Input();none.push(stu);/压入nstu.SetData(DING,21010102,80,80,90);none.push(stu);/压入nstu.SetData(“ZHANG”,“21010103”,80,90,70);none.push(stu);/压入ncout开始进行弹出操作!endl;nstu=one.pop();/弹出nstu.Output();nstu=one.pop();nstu.Output();/弹出nstu=one.pop();nstu.Output();nreturn 0;nnCStack:CStack(int nSize)n/初始化代码nm_nSize=nSize;nbuffer=new CStuScorem_nSize;/开辟栈空间nif(buffer!=NULL)/开辟成功nsp=buffer;/初建时,sp指向栈底nelsenexit(1);/若开辟不成功,程序非正常终止ncout栈空间已成功建立!endl;/显示成功的提示信息nnCStack:CStack()nnif(buffer)/判断nndelete m_nSizebuffer;/释放内存nbuffer=NULL;/一个好的习惯ncout栈空间已释放!buffer+m_nSize)nncout栈空间不够,栈溢出!endl;nexit(1);/程序非正常终止n elsen*sp+=a;/a写入栈和sp+合写一条语句nnCStuScore CStack:pop(void)nnsp-;nif(sp buffer)nncout已越过栈底!endl;nexit(1);/程序非正常终止n else nreturn *sp;/返回弹出的内容n程序运行结果如下:
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!