1第二章从结构到类的演变C++中的结构与C中的结构已经发生了质的变化。本章通过实例,简要说明结构如何向类变化,从而引入对象和类的知识。然后介绍c++标准程序库提供的两个典型的类。通过使用这两个类,进一步熟悉类和对象,为学习面向对象编程打下基础。22.1结构的演化2.1.1结构发生质的改变1、定义:由相互关联的相同或者不同数据类型的数据组成的有机整体。是一种构造数据类型。2、定义格式struct[结构体名]{类型标识符成员名1;类型标识符成员名2;…………….};例:structstudent{charname[20];intage;charsex;};一、c中的结构33、结构体变量的定义结构名称变量名称例如:structstudent{charname[20];intage;charsex;};studentstu1,stu2;只有在定义了结构体变量后系统才为其分配内存。定义结构体类型定义结构体变量44、结构体变量的引用•结构体变量不能整体引用,只能引用变量成员形式:结构体变量名.成员名例如:structstudent{charname[20];intage;charsex;};studentstu1,stu2;stu1.age=25;stu1.sex=‘F’;正确的成员使用5#includeiostreamusingnamespacestd;voidmain(){structstudent{charname[20];intage;charsex;};studenta;strcpy(a.name,zhang);a.age=12;a.sex='m';couta.name,a.age,a.sexendl;}strcpy():字符串复制函数。字符串的赋值不能使用“=”,只能使用函数来完成。6C++允许结构中可以定义函数,这些函数成为成员函数。如果将原来的结构成员称为数据成员的话,结构的定义形式为:struct结构名{数据成员成员函数};二、函数与数据共存(理解)定义结构体对象后,结构体对象自动具有结构体的数据成员和成员函数。可以通过以下形式来使用:对象名.成员函数()对象名.数据成员7structPoint{doublex,y;voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};structstudent{charname[20];intage;charsex;};//结构中只有数据//数据成员//成员函数函数与数据共存8#includeiostream//lt2_1.cppusingnamespacestd;structPoint{doublex,y;voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};voidmain(){Pointa;a.Setxy(10.2,5.3);a.Display();couta.x\ta.yendl;a.x=20.5;a.y=15.6;a.Display();couta.x\ta.yendl;}//定义结构对象a//使用成员函数,给数据成员赋值//直接使用数据成员//使用成员函数,显示数据成员的值//直接使用数据成员,并给其赋值10.25.310.25.320.515.620.515.6//数据成员9#includeiostream//lt2_1.cppusingnamespacestd;structPoint{doublex,y;voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};voidmain(){Pointa;a.Setxy(10.2,5.3);a.Display();couta.x\ta.yendl;a.x=20.5;a.y=15.6;a.Display();couta.x\ta.yendl;}由此例看出,可以通过结构的成员函数使用数据成员,a.Setxya.Displaya.xa.y也可以直接使用数据成员。这称作结构Point的公有(publie)性质10三、封装性若定义结构体时,使用了private关键字,则产生封装性。structPoint{doublex,y;voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};public:在结构体中,成员默认为public性质。private:public:11#includeiostreamusingnamespacestd;structPoint{private:doublex,y;public:voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};voidmain(){Pointa;a.Setxy(10.2,5.3);a.Display();couta.x\ta.yendl;a.x=20.5;a.y=15.6;couta.x\ta.yendl;a.Display();}voidmain(){Pointa;a.Setxy(10.2,5.3);a.Display();couta.x\ta.yendl;a.x=20.5;a.y=15.6;couta.x\ta.yendl;a.Display();}//使用公有的成员函数error:'x':cannotaccessprivatememberdeclaredinclass'Point'试图使用私有的数据成员私有的数据成员必须通过公有的成员函数才能使用,这就称为数据的封装性。这就变成了具有类的性质的结构使用了private关键字,则产生封装性12#includeiostreamusingnamespacestd;structPoint{private:doublex,y;public:voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};voidmain(){Pointa;a.Setxy(10.2,5.3);a.Display();}10.25.313由上可知:在定义结构时,若使用了private则产生封装性,表示成员为私有的,只能在结构体内部通过公有成员函数使用。若未添加private则表示默认为public。即:私有成员不可通过对象名.数据成员对象名.成员函数()形式来使用也就是说封装之后不可通过对象名使用private成员14四、从结构演变一个简单的类使用关键字class代替struct,就是一个标准的类。structPoint{private:doublex,y;public:voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};结构class类使用类产生对象的方式和结构一样。(如:)15#includeiostreamusingnamespacestd;classPoint{private:doublex,y;public:voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};voidmain(){Pointa;a.Setxy(10.2,5.3);a.Display();}10.25.316•类图的表示类名属性/成员变量操作(功能)/成员函数PointXySetxyDisplay17五、使用构造函数初始化对象因为类具有封装性,所以不能使用“对象名.数据成员”的方式对数据成员进行初始化。所以为类Point设计两个专门用于初始化的函数。其原型如下:因为类是一种数据类型,在声明一个类时系统并不会为其分配内存空间,所以在定义类中的数据成员时,不能对其进行初始化。classPoint{private:doublex=10.5,y=5.6;public:voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};错误Point();Point(double,double);若定义的函数与某个已定义函数重名而参数类型或个数不同,则称为。函数重载在定义类时,与类同名的函数称为构造函数。其作用是专门用于初始化对象。18classPoint{private:doublex,y;public:Point(){};Point(doublea,doubleb){x=a;y=b;}voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){coutx\tyendl;}};voidmain(){Pointa;a.Setxy(10.2,8.9);a.Display();}#includeiostreamusingnamespacestd;//定义对象a//设置a的数据成员//显示a的数据成员Pointa(10.2,8.9);a.Display();当对象在内存中产生时会自动调用构造函数19课程回顾1、在结构中,没有使用private定义的成员,默认为。public2、私有的数据成员,必须通过公有的成员函数才能使用,这称为数据的性。封装3、与结构不同的是,类使用关键字来定义,其成员默认的性质是。private202.3面向过程和面向对象•简单了解对象的含义211、面向过程的求解步骤:例题:给出三角形三个顶点坐标,计算三边长,并输出。(1)输入三个顶点坐标A(x1,y1),B(x2,y2),C(x3,y3)(2)计算(x1,y1)和(x2,y2)距离AB(3)计算(x1,y1)和(x3,y3)距离AC(4)计算(x2,y2)和(x3,y3)距离BC(5)输出三个距离AB、AC、BC22题解:lt2_6.cpp#includeiostream#includecmathusingnamespacestd;voidmain(){}23voidmain(){doublex1,y1,x2,y2,x3,y3;doubleAB,AC,BC;cout请输入A点的坐标(x1,y1);cinx1y1;cout请输入B点的坐标(x2,y2);cinx2y2;cout请输入C点的坐标(x3,y3);cinx3y3;AB=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));AC=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));BC=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));coutAB的距离:ABendl;coutAC的距离:ACendl;coutBC的距离:BCendl;}//声明变量242、面向对象的求解步骤(给出三角形三个顶点坐标,计算三边长,并输出)设计类:将点设计为一个类Point,并提供相关的属性和操作一个点对象:※应能存放x,y坐标;※能在定义时给出x,y值。※能设置点的x,y值;※能知道对象中存放的x,y坐标值※能计算点间距离,Pointx:doubley:doublePoint()Setxy(double,double)Getx()Gety()Getlength()25Pointx:doubley:doublePoint()Setxy(double,double)Getx()Gety()Getl