1第三章类的建立(封装性)主要内容包括:1.类的定义、调用及初始化--类的定义--成员函数定义(内联函数)--对象的初始化(构造和析构函数)--类的调用(一般调用)2.数据成员(const、static、动态、对象成员)3.类的调用(一般调用、动态调用、对象数组、const对象)4.this指针,封装机制及破坏5.C++中的字符串(课外思考)23.1定义类classCircle{private:intr;doubles;public:voidSet_R(){cinr;}doubleGet_S();};doubleCircle::Get_S(){s=3.14*r*r;returns;}voidmain(){CirclemyCircle;myCircle.Set_R();coutmyCircle.Get_S()endl;}3定义类•类的基本结构:class类名{private://私有数据和成员类体:进行属性public:和方法的//公有数据和成员定义protected://保护数据和成员};private、public和protected表示访问权限,不是每一个类同时都需具备这三种。4定义类—访问权限•访问权限限制了对类的数据和成员函数的访问;公有类型(public)声明了对类的外部接口,所有来自外部的访问通过接口进行;私有类型(private)只允许本类的成员函数来访问,类外部的访问都是非法的;保护类型(protected)介于公有和私有类型之间,对除本类及派生类以外的类不可访问。5定义类例:定义一个时钟类,能设置时间和显示时间。classClock{private:intHour,Minute,Second;public:voidSetTime(intNew_Hour,intNew_Minute,intNew_Second);voidUpdateTime();//刷新voidShowTime();};定义了一个类,就定义了一个新的数据类型。6定义类inthour;intminute;intsecond;SetTimeShowTime时钟类的形象描述:UpdateTime7定义类-成员函数的定义•类的成员函数是对类中的数据的操作,同时作为外部数据成员的接口,代表了类的对象的行为。•这些函数可以定义在类的内部,也可以定义在类体的外部。但都必须在类内声明。8定义类-成员函数的定义简短的成员函数可以直接在类体内直接定义实现部分classClock{private:intHour,Minute,Second;public:voidSetTime(intNew_Hour,intNew_Minute,intNew_Second);voidShowTime(){coutHour:Minute:Secondendl;};};9定义类-成员函数的定义在类体内说明成员函数,在类体外实现(加以限定)voidClock::ShowTime(){coutHour:Minute:Secondendl;}voidClock::SetTime(intNew_Hour,intNew_Minute,intNew_Second){Hour=New_Hour;Minute=New_Minute;Second=New_Second;}10定义类-成员函数的定义类外定义的内联函数inlinevoidClock::UpdateTime(){Second++;if(Second==60){Second=0;Minute++;}if(Minute==60){Minute=0;Hour++;}if(Hour==24){Hour=0;}}内联函数:类内定义的函数和inline限制的类外定义的函数。11定义类—内联函数•在类的内部定义的成员函数叫内联函数•对频繁调用的成员函数,定义为内联函数可以减少开销,而如果代码较长应在类外定义,只需定义时加上inline。12已定义类的调用例:调用前面定义的Clock类#includeiostream.h#include“Clock.h”//包含定义类的头文件voidmain(){ClockbeginClock;//内存中生成一个Clock类的实例beginClock.SetTime(9,55,01);//调用类的成员函数beginClock.ShowTime();}13类的调用--动态对象的创建和删除#include“Clock.h”//包含定义类的头文件voidmain(){ClockbeginClock;//生成一个Clock类的实例beginClock.SetTime(9,55,01);//调用类的成员函数beginClock.ShowTime();Clock*ptr1;ptr1=newClock;//Clock*ptr1=newClock;ptr1-SetTime(11,30,0);ptr1-ShowTime();deleteptr1;}14对象的初始化•在声明对象的时候给它的数据成员赋初值,称为对象的初始化•对象的初始化由构造函数完成•构造函数声明为公有函数,由系统编译时自动调用•如果不显式声明构造函数,则系统自动生成一个什么事也不做的构造函数15对象的初始化—构造函数classClock{private:intHour,Minute,Second;public:Clock(intNew_Hour,intNew_Minute,intNew_Second){…};Clock(){};Clock(intNewH=0,intNewM=0,intNewS=0){…};voidSetTime(intNew_Hour,intNew_Minute,intNew_Second);voidShowTime();};ClockBeginClock(9,55,0);//自动调第一或第三个构造函数ClockEndClock;//自动调用第二或第三个构造函数16构造函数构造函数的特点:P69-72•构造函数名与类名相同;•没有返回值;•定义在public下;•构造函数由系统自动调用;•不显式定义,系统自动生成一个不带参数的构造函数;•显示定义了构造函数后,缺省的构造函数不起作用;•构造函数可以重载;17构造函数•构造函数可以通过构造函数的初始化列表给其数据成员赋值classA{inta;intb;public:A(inti,intj):b(j),a(i){}……};数据成员初始化的执行顺序就是类中定义的数据成员的次序。错误的初始化:A(inti):b(i),a(b)18构造函数•构造函数中可以使用默认参数Circle(){};//不带参数的构造函数Circle(intr1){r=r1;}//带一个参数的构造函数可以合二为一:Circle(intr1=0){r=r1;}19构造函数•拷贝构造函数用一个类的对象初始化该类的另一个对象:Circle(Circle&myc){r=myc.r;}Circle(constCircle&myc)20析构函数•析构函数的作用:对象使用结束时进行的清理工作(如内存空间的释放);•析构函数名:~类名(){…};•析构函数不带形参,没有返回值;•定义在public下,由系统自动调用;•如果不显式定义,系统自动生成一个不做任何事的析构函数21classClock{private:int*Hour;public:Clock(int*New_Hour){Hour=newint;*Hour=*New_Hour;}voidShowTime(coutThehour:*Hour;);~Clock(){deleteHour;}};223.2数据成员1.const数据成员2.静态数据成员3.对象成员23数据成员—const数据成员•定义常量数据的方法:#definepi3.14;//宏定义constfloatpi=3.14;//用const定义•宏定义没有定义常数的数据类型。注:一般常量的定义放在头文件(.h)中24数据成员—const数据成员classPoint{constintn;//定义一个常数据成员n,这儿不可直接给n赋值public:Point(intk):n(k){}//常数据成员只能通过构造函数的初始化列表来获得初值voidprint(){coutn=nendl;}};voidmain(){Points(20);s.print();}25数据成员—静态数据成员--类间共享•对某个类所有对象都共同享有的成员•主要是解决同一个类不同对象间的数据共享问题•静态数据成员的定义格式:static数据类型数据成员名;•静态数据成员的使用方法:初始化格式在类外进行类型类名::静态数据成员=值;引用静态数据成员格式(1)如果定义为public,则可直接引用,格式为:类名::静态数据成员(2)如果定义为private,则只有通过接口函数引用26数据成员—静态数据成员例:统计一个类产生的对象的总数classStudent{public:Student(){CountS++;}staticintCountS;//定义为公有属性};intStudent::CountS=0;//初始化voidmain(){StudentStudent1,Student2;coutTheNumber:Student::CountS;}(引用)27数据成员—静态数据成员classStudent{public:Student(){CountS++;}intGetC(){returnCountS;}private:staticintCountS;//定义为私有};intStudent::CountS=0;voidmain(){StudentStudent1,Student2;coutTheNumber:Student1.GetC();}28数据成员—对象成员•定义了一个类,就定义了一个新的数据类型;•可以用其他类的对象作为一个类的数据成员,即对象成员--类嵌套;•类嵌套实现复杂的对象由比较简单的对象以某种方式组合而成。例:classPerson{charPersonName[30];charHomeAddr[60];DateBirthday;public:Person(char*name,char*addr,intmn,intdy,intyr);}29数据成员—对象成员•对象成员的关键问题是如何初始化,具体做法是在引用类的构造函数参数表后写上冒号:对象成员名及(初值表):例:Person::Person(char*name,char*addr,intmn,intdy,intyr):Birthday(mn,dy,yr){strncpy(PersonName,name,30);strncpy(HomeAddr,addr,60);}对象成员的初始化通过调用对象成员的构造函数来完成。注意带对象成员的类实例初始化顺序303.3对象数组和常对象•对象数组•常对象31类的调用—对象数组•定义了一个类后,可以如普通数组一样使用类来定义一组对象—对象数组;例:Clockmyclock[3];//三个对象,缺省构造函数Clockmyclock[4]={6,7,8,9};//4个对象,调带缺省值的构造函数,初值分别为(6,0,0)、(7,0,0)、(8,0,0)、(9,0,0);Clockmyclock[]={Clock(9,55,0),Clock(11,30,0)};//2个对象,调带三个参数的构造函数,初值分别为(9,55,0)、(11,30,0);32类的调用--const对象•const说明常量,也可以用它说明对象及对象成员•用const说明的对象,称为常对象,其任何数据成员都不能修改;例如:constDateMyBirthday(3,25,80);•const对象只能调用只读成员函数•只读成员函数的定义:在成员函数的后面加上const例如:in