资源描述:
《C++ 类类型.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第三章类类型数据封装C++语言与C语言最大的不同,在于C++语言增加了面向对象的概念。C++语言允许用户定义新的抽象数据类型。类类型,将一组数据和对它们的相关操作封装在一起,实现的是面向对象中的核心概念:数据封装;对象就是类类型的实例。3.1类与对象3.1.1类的定义定义用户定义的类型Date,考虑对该类型数据的操作,可能有:structDate{intd,m,y;};voidinit_date(Date&,int,int,int)Dateadd_day(Date&d,intn);函数和数据类型之间没有联系,因此,需要操作一个
2、Date数据时,需要Date类型的参数。C++语言允许在结构类型定义中,加入函数的定义,这些函数的目的,也是要操作某个结构的变量。该结构更复杂定义为:structDate{intd,m,y;voidinit_date(int,int,int);Dateadd_day(intn);};在Date中定义的函数称为成员函数,它们只能被对应的Date类型的变量(此时,称之为对象)以特殊的方式激活。该Date类型在C++语言中称为类类型,是一种抽象数据类型。对象激活成员函数的方式为:对象.成员函数(…)Datemy_birthday;v
3、oidf(){Datetoday;today.init_date(27,5,2002);my_birthday.init_date(12,7,1968);Datetomorrow=today;tomorrow.add_day(1);…}成员函数可以在类类型定义时给出,也可以在类类型定义时只给出成员函数的声明,在类型定义外再给出函数的定义。格式为:type类名::函数名(形参表){…}voidDate::init_date(intdd,intmm,intyy){d=dd;m=mm;y=yy;}在一个成员函数内部(函数体内),不需
4、要显示指明访问的数据是哪个对象的,虽然一个类类型的所有对象都具有该类类型中定义的所有数据,但成员函数能够“知道”它在操作的数据属于激活该函数的那个对象。在C++语言中,抽象数据类型更一般的形式为:classClass_name{…};称为类类型的定义,它定义了一个新类型。Class_name是类名,也就是该类型的类型名。结构类型中定义的数据成员并不是唯一地由结构中定义的成员函数进行操作;也可以使用结构变量.结构数据成员的方式访问结构类型中定义的数据成员。将struct改为class;可以限制类型中定义的数据的访问。classD
5、ate{private:intd,m,y;public:voidinit_date(int,int,int);Dateadd_day(intn);};其中:public将类类型中的成员分为两部分,第一部分为私有段,它们只能够被成员函数访问;第二部分为公有段,构成该类类型的对象的访问接口。注意:结构(struct)是一种特殊的类类型;结构缺省段约束符(private、protected和public)说明的成员是公有段成员。一个类类型中可以有两种成员:数据和操作。在C++中称它们为数据成员和成员函数。根据它们的被访问权限,成员又
6、可以分为私有段成员、保护段成员和公有段成员。class类名{private://定义私有段成员私有段数据和函数定义;public://定义公有段成员公有段数据和函数定义;};其中,类名是一个标识符,代表类类型的类型名;private、public称为段约束符,其中private可以缺省(即没有被段约束符说明的成员就是私有段成员);定义公有和私有成员的顺序可以是任意的。{}以内的部分称为类内;{}以外的部分称为类外。3.1.2数据封装一个类的定义实现了数据封装:类外不可见:(即封装起来的部分)私有段数据私有段函数原型私有段函数和
7、公有段函数的实现类外可见:类向外提供部分公有段数据公有段函数原型classDate{intd,m,y;public:voidinit_date(intd1,intm1,inty1){…}Dateadd_day(intn){…}};voidmain(){Datetoday,tomorrow;today.init_date(12,3,2003);tomorrow=today.add_day(1);tomorrow.d++;//error}注意:数据封装是一个相对的概念,只是对于类外而言,而对于类内,所有成员都是互相可见的。一个类的
8、成员函数的实现,可以在类内完成,也可以放在类外实现,但函数本身仍然是类内的函数。在类中定义的函数,自动默认为内联函数。类外实现的函数,不是内联函数。内外可以在原型前加上inline,使之成为内联函数。如:inlinevoidDate::init_date(intdd,intm