联系方式:北京源智天下科技有限公司第十讲:类和对象杨章伟e-mail:jtclass@163.com1-2北京源智天下科技有限公司联系方式:课程内容安排•类•对象•构造函数•拷贝构造函数•析构函数•友元•综合练习•思考和习题1-3北京源智天下科技有限公司联系方式:类•类(Class),指的是具有相似内部状态和行为的实体的集合。类的概念来自于人们认识自然、认识社会的过程。在这一过程中,人们主要使用两种方法:由特殊到一般的归纳法和由一般到特殊的演绎法。在归纳的过程中,从一个个具体的事物中把共同的特征抽取出来,形成一个一般的概念,即“归类”。例如:人、狮子、老鹰等等,因为其都能动,所以将其归类为动物,如图10-1所示。人老鹰狮子动物1-4北京源智天下科技有限公司联系方式:类的声明•C++中类的定义一般分为类的声明部分和类的实现部分。其中类声明的格式如下:•classClassName•{•private:•私有数据和函数•public:•受保护数据和函数•};1-5北京源智天下科技有限公司联系方式:类的访问控制•类的声明中,定义了两个类别的成员,分别为私有成员private类别和公有成员public类别。事实上,C++中,类体被分成如下的3类,•公有成员:以关键字public指明。•私有成员:以关键字private指明。•保护成员,以关键字protected指明。•上述的这几个关键字被称为访问说明符(accessspecifier),用来控制相应成员在程序中的可访问性,使得信息封装和模块化的风格更好。1-6北京源智天下科技有限公司联系方式:对象•现实世界中的对象是人们认识世界的基本单元,世界就是由这些基本单元―对象组成的。如一个人、一辆车、一次购物、一次演出等等。对象可以很简单,也可很复杂,复杂的对象可由若干个简单对象组成。对象是现实世界中的实体,其一般具有以下特性:•每个对象都有一个用于与其他对象相区别的名字。•具有某些特征,称它为属性或状态。•有一组操作,每一个操作决定对象的一种行为即对象能干什么。•对象的状态只能被自身的行为所改变。•对象之间以消息传递的方式相互通信。1-7北京源智天下科技有限公司联系方式:对象与类的关系•简单来说,对象与类的关系是具体与抽象的关系,比如水果为一个类,那么苹果就是一个对象,是水果类中的一个具体对象,如图10-8所示。水果(类)苹果(对象)1-8北京源智天下科技有限公司联系方式:构造函数•在定义类后,经常需要为一一为对象的成员变量指定初始值,因此,C++中引出了构造函数的概念。•构造函数(Constructor)是在类的定义的一种特殊的函数,其函数的名称与类的名称相同。构造函数的主要功能是为对象分配空间,也可用来为类成员变量赋初值,因此构造函数不能有返回类型,甚至不能有return语句。构造函数相当于要停车就必须要找个车位来放车,这个寻找车位的操作就是构造函数所要进行的操作,如图10-11所示。车位1车位n……汽车寻找车位构造函数1-9北京源智天下科技有限公司联系方式:构造函数的声明和定义•构造函数的声明和定义与普通成员函数的声明和定义类似。例如,下面语句给出了一个类的声明和定义,其中包含了构造函数的声明定义。•classcomplex•{•private:•doublereal,imag;//定义复数的实部和虚部•public:•complex(doubler,doublei)//定义构造函数,它的名字与类名相同•{•real=r;•imag=I;•}//初始化私有数据成员real和imag•voiddisp()•{•coutreal+imagiendl;•}•};1-10北京源智天下科技有限公司联系方式:构造函数的调用•一般来说,在定义对象的同时调用构造函数,其调用格式为:•类名对象名(实参表)1-11北京源智天下科技有限公司联系方式:支持函数的重载,所以一个类中也可以有多个不同参数形式的构造函数。用类去定义一个变量(后面可以附带参数),也就是在内存中产生一个类的实例(用类定义的实例变量通常也叫对象)时,程序将根据参数自动调用该类中对应的构造函数。事实上,C++允许对构造函数重载,也就是可以定义多个参数及参数类型不同的构造函数,用多种方法对对象初始化。对构造函数进行重载可以适应不同的情况,增加程序设计的灵活性,这些构造函数之间通过参数的个数或类型来区分。1-12北京源智天下科技有限公司联系方式:拷贝构造函数拷贝构造函数是一个特殊的构造函数,其作用是用一个已经存在的对象初始化本类的新对象。可更具自己的需要定义拷贝构造函数,也可由系统生成一个缺省的拷贝构造函数。拷贝构造函数没有返回值。拷贝构造函数名与类名相同,但参数是本类对象的引用。由于拷贝构造函数是一种特殊的构造函数,因此其声明和定义与普通的构造函数有些区别。一般来说,自定义拷贝构造函数的形式为:类名(类名&对象名){拷贝构造函数的函数体}1-13北京源智天下科技有限公司联系方式:调用拷贝构造函数一般来说,在三种情况下拷贝构造函数会被调用:用类的对象去初始化该类的另一个对象时。函数的形参是类的对象,调用函数进行形参和实参的结合时函数的返回值是类的对象,函数执行完返回调用者时。1-14北京源智天下科技有限公司联系方式:析构函数与构造函数类似的,析构函数也是一种特殊的成员函数,也被声明为公有成员。不同的是,析构函数作用时释放分配给对象的内存空间,并做一些善后工作。析构函数在声明定义和使用的时候需要注意如下的事项:析构函数的名字必须与类名相同,但在名字的前面要加波折号“~”。析构函数没有参数,没有返回值,不能重载,在一个类中只能有一个析构函数。当撤销对象时,系统会自动调用析构函数完成空间的释放和善后工作。1-15北京源智天下科技有限公司联系方式:友元友元提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。对于一个类,可以利用关键字friend将一般函数、其他类的成员函数或者是其他类声明为该类的友元,使得这个类中本来隐藏的信息(包括私有成员和保护成员)可以被友元所访问。如果友元是一般成员函数或是类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都成为友元函数。1-16北京源智天下科技有限公司联系方式:友元函数友元函数不是当前类的成员函数,而是独立于当前类的外部函数(包括普通函数和其他类的成员函数),但它可以访问该类的所有对象的成员,包括私有成员、保护成员和公有成员。友元函数要在类定义时声明,声明时要在其函数名前加上关键字friend。该声明可以放在公有部分,也可以放在私有部分。友元函数的定义既可以在类内部进行,也可以在类外部进行。但通常都定义在类外部。C++中,将普通函数声明为友元函数的一般形式为:friend数据类型友元函数名(参数表);1-17北京源智天下科技有限公司联系方式:友元类当一个类作为另一个类的友元时,称这个类为友元类。当一个类成为另一个类的友元类时,这个类的所有成员函数都成为另一个类的友元函数,因此,友元类中的所有成员函数都可以通过对象名直接访问另一个类中的私有成员,从而实现了不同类之间的数据共享。C++中,友元类的声明可以放在类声明中的任何位置,这时,友元类中的所有成员函数都成为友元函数。友元类声明的一般形式如下:firiendclass友元类名;或firiend友元类名;1-18北京源智天下科技有限公司联系方式:综合练习•该范例定义了一个类CPoint,在该类中定义了构造函数、重载构造函数和析构函数,在main()函数中调用该类创建对象pt,查看该对象调用成员函数的输出情况。1-19北京源智天下科技有限公司联系方式:思考和习题•类的成员函数如果不使用构造函数和析构函数,能否对数据成员进行赋值?•构造函数和析构函数能否由用户显式调用?•拷贝构造函数的作用是什么?•友元函数和友元类的作用是什么?•创建一个通讯录类,包含姓名、地址、邮编、手机、固话等信息。使用成员函数实现输入记录和删除记录。