您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第4章《C++程序设计教程与实验指导》-杨国兴类与对象
C++语言程序设计杨国兴张东玲彭涛中国水利水电出版社第4章类与对象4.1类与对象4.2构造函数与析构函数4.3类的组合4.4友元4.5静态成员4.6对象数组与对象指针4.7this指针4.1类与对象4.1.1类与对象的概念对象(object):是现实世界中的客观事物。类(class):是把具有相同属性的事物划分为一类,从而得出的抽象概念。面向对象程序设计中的类,是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了抽象的描述。对象是类的实例,类是同种对象的抽象。第4章类与对象如:确定大小和颜色的矩形都是一个个具体的对象,而将所有矩形的共同特点抽象出来,就是一个矩形类。这些共有的属性包括颜色(color),左上角坐标(left,top),长(length)和宽(width)等;对这些属性的处理包括改变矩形的颜色(SetColor)和大小(SetSize),移动矩形到新的位置(Move),绘出矩形(Draw)等。将矩形的这些属性和方法作为一个整体,封装在一起形成一个矩形类。4.1类与对象4.1.2类的声明class类名{private:私有数据成员和成员函数;protected:保护数据成员和成员函数;public:公有数据成员和成员函数;};第4章类与对象例4.1定义一个长方形类CRect,其数据成员包括颜色,左上角坐标,长和宽,其函数成员包括改变矩形的颜色(SetColor)和大小(SetSize),移动矩形到新的位置(Move),绘出矩形(Draw)。classCRect{private:charcolor[10];intleft;inttop;intlength;intwidth;public:voidSetColor(char*c);voidSetSize(intl,intw);voidMove(intt,intl);voidDraw();};第4章类与对象例4.1(续一)voidCRect::SetColor(char*c){strcpy(color,c);}voidCRect::SetSize(intl,intw){length=l;width=w;}voidCRect::Move(intt,intl){top=t;left=l;}voidCRect::Draw(){cout矩形左上角坐标为(left,top)endl;cout矩形长和宽分别为length,widthendl;cout矩形的颜色是colorendl;}第4章类与对象域运算符(::)用于指出该函数是哪一个类的成员函数,用法:类名::函数名(参数表)例4.1(续二)voidmain(){CRectr;r.SetColor(Red);r.Move(10,20);r.SetSize(100,200);r.Draw();r.Move(50,50);r.SetColor(Blue);r.Draw();}第4章类与对象定义CRect类的对象,定义对象的格式:类名对象名1,对象名2,……访问对象的公有成员,格式为:对象名.公有成员函数名(参数表)对象名.公有数据成员名程序运行结果为:矩形左上角坐标为(20,10)矩形长和宽分别为100,200矩形的颜色是Red矩形左上角坐标为(50,50)矩形长和宽分别为100,200矩形的颜色是Blue4.1类与对象4.1.3成员的访问控制private:私有访问权限,只允许类中的成员函数访问,其他函数不能访问。protected:保护访问权限,在第7章中介绍。public:公有访问权限,在任何函数中都可以访问。例:若主函数中有以下语句,是否正确?CRectr;strcpy(r.color,“red”);r.top=10;r.left=20;第4章类与对象在主函数中不能访问类的私有成员4.1类与对象4.1.3成员的访问控制(续)若不指定类中的成员的访问权限,则默认为私有成员。类也可以由struct关键字声明,strust与class的区别是:如果不指定访问权限,前者缺省的访问权限是公有的,而后者是私有的。用struct声明前面的矩形类:structCRect{voidSetColor(char*c);voidSetSize(intl,intw);voidMove(intt,intl);voidDraw();private:charcolor[10];intleft;inttop;intlength;intwidth;};第4章类与对象4.1类与对象4.1.4类的成员函数1.类成员函数的定义方式在类外部定义:如前面定义的长方形类的成员函数一般格式为:函数类型类名::成员函数名(参数说明){函数体}在类中定义:如classCRect{……public:voidsetcolor(char*c){strcpy(color,c);}……};第4章类与对象4.1类与对象4.1.4类的成员函数(续一)2.内联成员函数将成员函数的定义直接写在类中即成为内联成员函数在类外定义时用inline指出:如:inlinevoidCRect::SetColor(char*c){strcpy(color,c);}第4章类与对象4.1类与对象4.1.4类的成员函数(续二)3.带默认参数值的成员函数注意:默认参数只能在声明或定义中的一处给出,即如在类中的函数声明已经给出默认参数值:voidSetSize(intl=100,intw=100);则在函数定义时就不能再给出默认值。同样如果在定义时给出了默认值:voidCRect::SetSize(intl=100,intw=100){length=l;width=w;}在声明处就不能再给默认值了。第4章类与对象返回4.2构造函数与析构函数构造函数:对对象进行初始化。析构函数:在对象销毁时进行内存释放等清理工作。4.2.1构造函数1.构造函数的特点(1)构造函数的函数名与类名相同。(2)不能定义构造函数的类型(即不能指明构造函数返回值的类型)。(3)构造函数应声明为公有函数。(4)构造函数不能在程序中调用,在对象创建时,构造函数被系统自动调用。2.构造函数的作用构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于其它对象的特征。第4章类与对象例为CRect类添加构造函数classCRect{private:charcolor[10];……public:CRect();CRect(char*c,intt,intleft,intlen,intwid);voidSetColor(char*c);……};CRect::CRect(){strcpy(color,Black);top=0;left=0;length=0;width=0;}二者是重载函数,在定义对象时,如果不给出参数,就自动调用第一个构造函数,如果给定5个参数就自动调用第二个构造函数。第4章类与对象例为CRect类添加构造函数(续)CRect::CRect(char*c,intt,intlef,intlen,intwid){strcpy(color,c);top=t;left=lef;length=len;width=wid;}voidmain(){CRectr1;//自动调用第一个构造函数CRectr2(“red”,10,10,100,100);//自动调用第二个构造函数CRectr3(green,200,200,50,50);//自动调用第二个构造函数r1.Draw();r2.Draw();r3.Draw();}第4章类与对象例4.2构造函数的初始化表#includeiostreamusingnamespacestd;classA{private:constdoublePI;intb;int&c;public:A(intx):PI(3.14),c(b){b=x;}voidOutput(){coutPI,b,cendl;}};第4章类与对象voidmain(){Ax(10);x.Output();}程序运行结果:3.14,10,104.2构造函数与析构函数4.2.2析构函数1.析构函数的特点(1)析构函数名字为符号“~”加类名。(2)析构函数没有参数,不能指定返回值类型。(3)一个类中只能定义一个析构函数,所以析构函数不能重载。(4)当一个对象作用域结束时,系统自动调用析构函数。如CRect类的析构函数声明为:~CRect();定义为:CRect::~CRect(){……}2.析构函数的作用在删除一个对象前被调用,释放该对象成员的内存空间,以及其它一些清理工作。第4章类与对象例4.3设计一个简单的字符串类,类中有两个数据成员,分别表示字符串的长度和字符串的内容,有一个构造函数和一个析构函数,函数GetLength()返回字符串长度,函数GetContents()获得字符串的内容,重载函数SetContents()给字符串设置值。#includeiostream#includestringusingnamespacestd;classCString{private:intlength;char*contents;public:CString();//构造函数~CString();//析构函数intGetLength();voidGetContents(char*str);voidSetContents(intlen,char*cont);voidSetContents(char*cont);};第4章类与对象例4.3(续一)CString::CString(){length=0;contents=NULL;cout字符串对象初始化endl;}CString::~CString(){coutcontents被销毁endl;if(contents!=NULL)deletecontents;}intCString::GetLength(){returnlength;}voidCString::GetContents(char*str){strcpy(str,contents);}第4章类与对象例4.3(续二)voidCString::SetContents(intlen,char*cont){length=len;if(contents!=NULL)deletecontents;contents=newchar[len+1];strcpy(contents,cont);cout两个参数的SetContents函数endl;}voidCString::SetContents(char*cont){length=strlen(cont);if(contents!=NULL)deletecontents;contents=newchar[length+1];strcpy(contents,cont);cout一个参数的SetContents函数endl;}第4章类与对象重载函数SetContents()都是将要设置的字符串长度赋给数据成员length,然后判断原来数据成员contents是否已经有数据(即已经不为空NULL了),如果已不为空,则先释放原来的内存,再根据新字符串的长度重新申请内存。例4.3(续三)voidmain(){CStringstr1,str2;//两次调用构造函数str1.SetContents(第一个字符串);//调用有一个参数的SetContents函数str2.SetContents(20,第二个字符串两个参数);//调用有两个参数的SetContents函数inti=str1.GetLength();charstring[100];str1.GetContents(string);coutistringendl;i=str2.GetLength();str2.GetContents(string);coutis
本文标题:第4章《C++程序设计教程与实验指导》-杨国兴类与对象
链接地址:https://www.777doc.com/doc-2194605 .html