第6章类与对象P216•类(Class)是面向对象程序设计(OOP)实现信息封装的基础。•类是用户定义类型,也称为类类型。•每个类包含数据说明和一组操作数据或传递消息的函数。•类的实例称为对象。6.1类和对象的定义与访问P216•在面向对象程序设计中,类是程序基本单位。•类是数据和操作数据的函数的封装。•类的对象使用自己的方法完成对数据的操作。•类可以隐藏数据和操作细节,对象通过类接口与外部通信。例1-2用面向对象方法编程,求圆的周长和面积P4圆类数据成员半径成员函数置半径值求圆的半径求周长求面积实例化//例1-2输入圆的半径,求圆的周长和面积(用面向对象方法编程)P4#includeiostreamusingnamespacestd;classCircle{private:doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14f*radius;}doubleGet_Area(){return3.14f*radius*radius;}};intmain(){CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;return(0);}例1-2用面向对象方法编程,求圆的周长和面积#includeiostreamusingnamespacestd;classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};intmain(){CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;}数据成员例1-2用面向对象方法编程,求圆的周长和面积#includeiostreamusingnamespacestd;classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};intmain(){CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;}成员函数例1-2用面向对象方法编程,求圆的周长和面积#includeiostreamusingnamespacestd;classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};intmain(){CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;}建立对象(类类型变量)例1-2用面向对象方法编程,求圆的周长和面积#includeiostreamusingnamespacestd;classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};intmain(){CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;}通过对象调用类的成员函数6.1.1定义类与对象P218•C++中,类定义的说明语句一般形式为:class类名{public:公有性质数据成员和成员函数;protected:保护性质数据成员和成员函数;private:私有性质数据成员和成员函数;};说明P218•其中,class是定义类的关键字。•“类名”是用户自定义的标识符,用于标识类型名字。通常第一个字母大写。•一对花括号相括说明类成员,以分号结束类定义语句。*成员的性质•类成员用关键字指定不同访问特性,决定其在类体系中或类外的可见性。•private声明私有成员:私有性质成员仅在类中可见。不能在类外或派生类中使用。如果私有类成员放在放在第一段,则可以省略关键字private。(建议不省)•protected声明保护成员:保护性质成员在本类和它的派生类中可见。•public声明公有成员:公有性质的成员是的接口,在类中和类外可见。•各段中既可以包含数据成员,也可以包含成员函数。成员函数可在类外定义P219•成员函数在类外定义,使用作用域区分符进行说明,此时函数头形式为:返回类型类名::函数名(参数表)•简单的成员函数实现可以在类中定义,此时编译器作内联函数处理。关键字struct也可定义类P218•除了关键字class外,关键字struct也可定义类。•用关键字struct也可定义类时,若不特别指出,则所有成员都是公有成员。关于类声明的进一步说明1.允许已定义类名出现在类的说明中允许已定义类名出现在类的说明中例:classX{……};classY{XdataMember;……};允许已定义类名出现在类的说明中例:classlink{link*next;//声明一个指向link类类型的指针……};2.类可以无名,用于直接声明对象例:class{……}mydate;3.类是一个程序包•可以只有数据成员或只有成员函数,或者为空#includeiostreamusingnamespacestd;classempty{};intmain(){emptye1;cout&e1=&e1endl;coutsizeofe1=sizeof(e1)endl;}“类”类型变量的定义P219•“类”类型变量的定义,定义方法与普通变量相同。•说明一个类类型的对象(变量)后,编译器为每个对象的数据成员分配内存。•对象没有成员函数的副本,类成员函数可以被对象调用。6.1.2访问对象成员P220•公有成员是提供给外部的接口。•类外用“.”和“-”运算符访问对象成员。访问对象的公有成员P220//例6-1访问对象的公有成员P220#includeiostreamusingnamespacestd;classTclass{public:intx,y;voidprint(){coutx“,”y;};};intmain(){Tclasstest;test.x=100;test.y=200;test.print();}//例6-2用指针访问对象成员#includeiostreamusingnamespacestd;classTclass{public:intx,y;voidprint(){coutx,yendl;};};intadd(Tclass*ptf){return(ptf-x+ptf-y);}intmain(){Tclasstest,*pt=new(Tclass);pt-x=100;pt-y=200;pt-print();test.x=150;test.y=450;test.print();coutx+y=add(&test);}6.1.3this指针P221•C++中,同一类的各个对象都有自己的数据成员的存储空间,系统不为每个类的对象建立成员函数副本,但类的成员函数可以被各个对象调用。•C++为成员函数提供了一个称为this的隐含指针参数,所以常常称成员函数拥有this指针。•当一个对象调用类的成员函数时,对象的地址被传递给this指针,即this指针指向了该对象。•this指针不能显式声明,但可以显式使用。说明•this指针是一个常指针,相当于:•class_Type*constthis;•其中:•class_Type是用户定义的类类型标识符。•这里,this指针一旦初始化(成员函数被调用)之后,获取了对象地址,指针值就不能再修改和赋值,以保证不会指向其它对象。•this指针的显式使用主要在运算符重载、自引用等场合。this指针#includeiostreamusingnamespacestd;classSimple{intx,y;public:voidsetXY(inta,intb){x=a;y=b;}voidprintXY(){coutx,yendl;};};intmain(){Simpleobj1,obj2,obj3;obj1.setXY(10,15);obj1.printXY();obj2.setXY(20,25);obj2.