C类的精解秒用.pptx
类的声明 class 名称 成员 ;class studentcharname20;intsex;/student类中定义了两个成员变量是不是觉得与结构体没什么差别,那么再看下面这个例子。关键字class标识类定义第2页/共29页第1页/共29页 classstudentcharname20;intsex;voidchangename(char*lname)strcpy(name,lname);voidchangesex(intlsex)sex=lsex;发现类可以定义C语言中的结构体不能定义的函数changename(),changesex()。第3页/共29页第2页/共29页类的定义类的定义一般分为说明部分和实现部分。说明部分数据成员说明 属性成员函数说明 方法第4页/共29页第3页/共29页类的成员函数的实现有两种方式:在类中边定义边实现。在类中定义在类外实现。请先记住有这两种方式,具体如何实现后面会讲到。第5页/共29页第4页/共29页类的一般定义格式classpublic:private:;/分号不能忘是不是有一个疑问,public,private指的是什么呢?第6页/共29页第5页/共29页其中,class是定义类的关键字。从访问权限上来分,类的成员可以分为三种:公有的(public),私有的(private)和保护的(protected)。public private protected可以被同类的方法和类之外的方法随意调用只能被同类中的方法访问,其它类都不能访问只能被同类和子类的方法访问,其余访问均会遭到拒绝第7页/共29页第6页/共29页classDatepublic:voidSetDate(inty,intm,intd);intIsLeapYear();/只有定义,没有实现,需在类外实现voidPrint()coutyear“.”month“.”dayendl;/在类中边定义边实现private:intyear,month,day;/三个私有成员变量;函数名往往是由多个单词组成的,习惯约定每个单词的第一个字母用大写字母,其余用小写,单词间不加任何分隔符。那么,函数在类外如何实现呢?Date类的定义第8页/共29页第7页/共29页类体外实现成员函数的格式:返回类型:():称为作用域运算符,用来标识某个成员函数是属于哪个类的。voidDate:SetDate(inty,intm,intd)year=y;month=m;day=d;intDate:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);第9页/共29页第8页/共29页对象的定义类定义完后如何使用呢?答案是通过对象,对象是类的实例。对象的定义格式:对象名表可以一个或多个对象名,多个时用逗号分隔。可以是一般的对象名,还可以是指向对象的指针和对象数组。Datedate1,date2,*Pdate,date31;date1,date2是一般的对象名,*Pdate是指向对象的指针,date是对象数组的数组名,它有31个元素,每个元素都是一个Date类的对象。第10页/共29页第9页/共29页对象成员的表示方法一个对象的成员就是该对象的类所定义的成员。一般对象表示如下:.或.().是一个运算符,表示对象的成员。date1.year;date1.SetDate(inty,intm,intd);但是Pdate.year却是错的,为什么呢?第11页/共29页第10页/共29页对象指针的成员表示法:-或者-()-也是一个表示成员的运算符,与.的区别是:-是用来表示指向对象的指针的成员,而.用来表示一般对象的成员。Pdate-yearPdate-SetDate(inty,intm,intd)第12页/共29页第11页/共29页下面两种定义是等价的:-(*).Pdate-SetDate(y,m,d)(*Pdate).SetDate(y,m,d)第13页/共29页第12页/共29页定义类时应注意事项在类体中不允许对所定义的数据成员进行初始化。例如:classDatepublic:private:intyear(1998),month(4),day(9);是错的。第14页/共29页第13页/共29页类中的数据成员的类型可以是任意的,包含整型,浮点型,字符型,数组和引用等。也可以是对象,另一个类的对象,但是自身类的对象是不可以的,而自身类的指针或引用是可以的。第15页/共29页第14页/共29页一般地,在类体内先说明公有成员,它们是用户所关心的,后说明私有成员,它们是用户不感兴趣的。在说明数据成员时,一般按数据成员的类型大小,由小至大说明。成员函数可以重载,但必须满足重载条件:参数类型不同或参数个数不同。第16页/共29页第15页/共29页对象的初始化构造函数和析构函数是在类体中说明的两种特殊的成员函数。构造函数的功能是在创建对象时,使用给定的值来将对象初始化。析构函数的功能是用来释放一个对象的。在对象删除前,用它来做一些清理工作,它与构造函数的功能正好相反。加入构造和析构函数的Date1类如下:第17页/共29页第16页/共29页classDate1public:Date1(inty,intm,intd);/构造函数Date1();/析构函数voidPrint();private:intyear,month,day;Date1:Date1(inty,intm,intd)year=y;month=m;day=d;cout“Constructorcalled.n”;Date1:Date1()cout“Destructorcalled.n”;加入构造函数和析构函数的Date1类第18页/共29页第17页/共29页构造函数的特点构造函数是成员函数,函数体可写在类体内,也可写在类体外。构造函数是一个特殊的函数,该函数的名字与类名相同,该函数不指定类型说明。可以有一个参数,也可以有多个参数。构造函数可以重载,可以定义多个参数个数不同的函数。程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。第19页/共29页第18页/共29页析构函数的特点析构函数是成员函数,函数体可写在类体内,也可以写在类体外。析构函数也是一个特殊的函数,它的名字与类名相同,并在前面加“”字符。析构函数不指定数据类型,并且也没有参数。一个类中只可能定义一个析构函数。析构函数可以被调用,也可以系统调用。在下面两种情况下,析构函数会被自动调用。(1)如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。(2)当一个对象是使用new运算符被动态创建时,在使用delete运算符释放它时,delete将会自动调用析构函数。第20页/共29页第19页/共29页在类定义时没有定义任何构造函数时,编译器会自动生成一个不带参数的缺省构造函数。voidmain()Date1today(2009,3,13),tomorrow(2009,3,14);cout“todayis”;today.Print();执行该程序后,输出结果是什么呢?Constructorcalled.Constructorcalled.todayis2009.3.13Destructorcalled.Destructorcalled.第21页/共29页第20页/共29页堆对象堆对象是指在程序运行过程中根据需要随时可以建立或删除的对象。需要如下两个运算符:newdelete第22页/共29页第21页/共29页new的用法new运算符使用格式如下:new()它表明在堆中建立一个由类型说明符给定的类型的对象,并且由括号中的初始值列表给出被创建对象的初始值。如果省去括号中的初始值,则对象选用缺省值。new运算符返回的是一个指针,指针类型与new所分配对象相匹配,如果不匹配可以通过强制类型的方法,否则会编译出错。第23页/共29页第22页/共29页new也可用来创建数组类型的对象,即对象数组,格式如下:new算术表达式的值为所创建的对象数组的大小。A*ptr;ptr=newA5;A是一个类名,ptr是指向类A对象的一个指针。通过newA5创建一个对象数组,该数组有5个元素。它的返回值赋给指针ptr,于是ptr便是指向对象数组的指针。第24页/共29页第23页/共29页new还可以用来创建一般类型的数组。如:int*p;p=newint10;其中,p是一个指向int型变量的的指针。使用new创建一个具有10个元素的一维int型数组,p指针指向这个数组。第25页/共29页第24页/共29页delete用法delete功能是用来删除使用new创建的对象或一般类型的指针。格式如下:delete如:A*ptr;ptr=newA(5,6);deleteptr;第26页/共29页第25页/共29页delete也可用来删除使用new创建的对象数组,格式如下:delete如:A*ptr;ptr=newA5;deleteptr;第27页/共29页第26页/共29页delete也可以删除由new创建的一般类型的数组。如:int*p;p=newint10;deletep;在使用delete时,应注意它必须使用于由运算符new返回的指针。第28页/共29页第27页/共29页Theend!第29页/共29页第28页/共29页感谢您的欣赏!第29页/共29页