《C的类和对象》PPT课件.ppt

上传人:tia****nde 文档编号:12708191 上传时间:2020-05-14 格式:PPT 页数:31 大小:211KB
返回 下载 相关 举报
《C的类和对象》PPT课件.ppt_第1页
第1页 / 共31页
《C的类和对象》PPT课件.ppt_第2页
第2页 / 共31页
《C的类和对象》PPT课件.ppt_第3页
第3页 / 共31页
点击查看更多>>
资源描述
第6章C+的类和对象,本章要点:类和类对象的定义静态类成员的定义和应用const类对象及其成员的定义和应用指向类成员指针的定义和应用构造函数和析构函数的定义和调用三种特殊的类:嵌套类、局部类和联合类类域的基本概念,6.1循序渐进学理论,6.1.1类的定义,1.类的定义方法类是对客观事物的一种高度抽象,是具有一组相同属性和操作的集合,因此它包括两个部分的内容:数据成员和成员函数,其定义格式如下:classpublic:/private:/protected:/,2.数据成员数据成员的声明方式和变量的声明方式基本相同,格式如下:;需要注意的是,在声明一个数据成员时:(1)不能采用auto、extern和register修饰符进行修饰;(2)只有采用static修饰符声明的静态数据成员才可以被显式初始化,它具有特殊的属性。非静态数据成员只能通过构造函数才能够被初始化,若试图在类体中直接初始化非静态数据成员,会导致编译错误。,3.成员函数成员函数在类体中的声明方式和普通函数的声明方式相同,其格式如下:()成员函数可以在类体内被定义,也可以在类体外被定义。如果在类体外定义成员函数,必须先用域运算符“:”指出该成员函数所属的类,其定义格式如下::(),4.访问限制C+语言通过访问限定符public、private和protected将类成员分成三类:公有成员、私有成员和保护成员。公有成员可以被该类的成员函数访问,也可以在程序的任意地方被任意访问。私有成员只能被该类的成员函数或者该类的友元函数访问。友元是为了增加程序的灵活性而引入的概念,允许程序中的某些函数访问类中的私有成员。保护成员对于派生类来说,就像是公有成员,可以被访问,对于程序的其他部分来说,就象是私有成员,不允许被访问。,6.1.2类对象的定义,1.类对象的定义类可以被看作是一种自定义类型,用来定义具体的对象,格式如下:;例如,可以用学生类Student去定义对象张三:StudentzhangShan;/定义1个类对象,2.动态类对象的创建可以用new表达式创建动态的类对象,它的寿命期由程序员掌控,定义格式如下:new();其中初始值是可选项,若给出了初始值,系统会自动调用相应的构造函数初始化新创建的类对象,否则调用缺省构造函数进行初始化。采用delete表达式释放动态类对象的格式如下:delete;释放动态类对象数组的格式如下:delete;,3.类对象成员的访问一般来说,在程序中必须使用点成员运算符“.”或者箭头成员运算符“-”,才能访问类对象的成员。其中,“.”用于类对象或引用,“-”用于指向类对象的指针。假设有类对象定义如下:StudentHuangShan;Student*ZhengXiang;按如下方式调用类对象的成员函数average():coutaverage();/正确!,6.1.3类对象的构造和析构,1.构造函数的概念构造函数是一种特殊的类成员函数,其函数名和类名相同。在定义类对象时,系统会自动调用该类的构造函数,完成类对象中数据成员的初始化,其声明格式如下:();注意,构造函数的名称必须与类名称相同。构造函数没有任何的返回值,所以不能有返回类型。构造函数也不能被声明为const,缺省构造函数有两种定义方法:一是令参数列表为空,二是有一个或多个含有默认值的参数。例如:Student(inti=0,char*j=);/也是缺省构造函数,2.构造函数的定义习惯上,在构造函数的函数体内对数据成员进行初始化,例如:Student:Student(inti,char*j)reg_num=i;name=j;另外,还有一种初始化方式:成员初始化列表。它位于参数列表和函数体之间,由冒号开头,后跟数据成员的名字和初值,初值放在圆括号内,类似于函数调用形式。例如,上述代码可以被改写为:Student:Student(inti,char*j):reg_num(i),name(j),3.构造函数的调用创建一个类对象时,系统会自动调用构造函数初始化类对象成员,程序员可以用下面方式将实参传递给构造函数:StudenthuaNan(501,Hunan);如果在定义类对象时,没有指定实参,系统会自动调用缺省构造函数。初学者易犯的错误是误用空括号,例如:StudenthuaNan();/错误!StudenthuaNan;/正确!系统自动调用缺省构造函数,4.拷贝构造函数当用一个类对象显式初始化另一个类对象,或者把一个类对象作为实参传递给函数,或者将类对象作为函数的返回值,或者将一个类对象插入容器中时,系统会自动生成一个特殊的拷贝函数,依次拷贝类对象中的每一个非静态数据成员。有时,缺省按成员初始化不能满足实际需求,甚至会导致错误。C+语言提供拷贝构造函数来改变缺省按成员初始化过程。拷贝构造函数的函数名和类名相同,参数为指向类对象的引用,定义格式如下::(,6.1.4this指针,在定义类对象时,每一个类对象都会拥有一份独立的非静态的数据成员,而共享同一份成员函数拷贝。显然,这样做的好处是可以节约存储空间。但是,在程序运行过程中,类对象是如何将成员函数绑定到属于它们自己的数据成员上的呢?this指针就是完成这项绑定任务的“上帝之手”。所谓this指针,就是指向调用成员函数的类对象的指针。需要注意的是,this指针通常由系统自动隐式调用,,6.1.5静态数据成员和成员函数,1.静态数据成员静态数据成员是一种特殊的数据成员,在定义类对象时,所有的类对象都共享同一份静态数据成员拷贝。其定义格式如下:static;静态数据成员通常在类体外被初始化,并且在程序中只能被初始化一次,其格式为::=;,有两种方式可以在程序中访问静态数据成员:(1)和非静态数据成员一样,通过成员访问符“.”或者“-”访问静态数据成员:AccounthuaNan;amount=amount+amount*HuaNan.rate;(2)由于静态数据成员的存在与对象无关,所有的类对象都共享同一份静态数据成员的拷贝,所以也可以通过类名和域运算符“:”来直接访问静态数据成员:amount=amount+amount*Account:rate;,2.静态成员函数将只访问静态数据成员的成员函数声明为静态成员函数,格式如下:static()注意,如果在类体外定义静态成员函数,不能使用关键字static。例如:voidAccount:raiseRate(doublei)rate+=i;和静态数据成员一样,可以通过成员访问符“.”或者“-”访问静态成员函数,也可以通过类名和域运算符“:”来直接访问它。,如果不希望类对象被修改,可以将它定义为const类对象。例如,定义一个const类对象run_err:constWatch_errrun_err;const类对象run_err的定义带来了两个问题:第一,由于const类对象只能调用声明为const的成员函数,所以必须将成员函数声明为const成员函数。第二,如果const成员函数需要修改const类对象中的数据成员,那么必须用关键字mutable重新声明该数据成员。mutable的含义是“总能被修改”。,5.1.6const类对象和mutable数据成员,1.静态数据成员可以定义一个指针,使其指向类成员。其中,指向非静态数据成员的指针的定义格式如下::*=指向非静态数据成员的指针的使用格式如下:.*或者:-*,5.1.7指向类成员的指针,2.指向成员函数的指针定义一个指向非静态成员函数的指针必须在三个方面与其指向的成员函数保持一致:一是参数列表要相同;二是返回类型要相同;三是所属的类要相同。其定义格式如下:(:*)()=/错误!,类对象数组是指数组元素为类对象的数组,定义格式如下:;例如,定义了一个有50个元素的类对象,并由系统自动调用缺省构造函数对每一个元素进行初始化:StudentgradeOne50;如果没有缺省构造函数,则必须显式地调用构造函数并提供全部的实参,例如:StudentgradeOne50=Student(Tom,101);Student(Jerry,102);Student(Mary,103);,6.1.8类对象数组,6.1.9友元,1.友元函数所谓友元函数,就是将程序中的任意一个函数,甚至是另一个类定义中的成员函数,声明为友元。它不是成员函数,出现在类定义中只是为了说明某个函数是该类的“朋友”,所以不必将友元函数的声明放在成员访问权限区(public、private和protected)中,而是放在类声明的开始位置。其声明格式如下:friend();其中,friend是关键字,后面跟的是函数原型。,2.友元类除了函数之外,一个类也可被声明为另一个类的友元,该类被称为友元类。假设有类A和类B,若在类B的定义中将类A声明为友元,那么,类A被称作类B的友元类,它所有的成员函数都可以访问类B中的任意成员。友元类的声明格式:friendclass;,每一个类体都定义了一个独立的类域,其作用范围从左花括号开始至右花括号结束。通常,类成员只有在各自的类域中才是可见的,在类域外引用类域中的成员,需要通过成员访问运算符,但是也有两种例外情况:一是在类体外定义成员函数时,可以直接使用同类中的数据成员,这种情况已经在6.1.2节中介绍过。二是在类体外初始化静态数据成员时,如果使用类域中的成员,也不需要访问运算符,因为从静态数据成员名开始,一直到该语句的结束都会被看作是类域的一部分。,6.1.10类域,1.嵌套类嵌套类是指在一个类中定义的类,其外层的类被称为外围类。有两种定义嵌套类的方法:第一种方法是直接在外围类中定义嵌套类,第二种方法是在外围类外定义嵌套类,例如:classA/外围类private:classB/嵌套类,声明为私有public:/嵌套内中的所有成员都是公有的/,6.1.11嵌套类和局部类,2.局部类局部类是指定义在一个函数体内的类,不能在局部类中定义静态数据成员,并且所有的成员函数都必须定义在类定义中。例如:voidfun()classA/局部类/,1.联合类的定义联合类是一种特殊的类,它只维持一个足够大的存储空间,在某一个时刻,只存储其中的一个数据成员,而不会为所有的数据成员都分配存储空间。其定义格式如下:unionprivate:/public:/protected:/.;联合类的数据成员不能是静态成员、引用成员,也不能是定义了构造函数、析构函数或者拷贝赋值运算符的类类型成员。,6.1.12联合类,2.联合类的使用访问联合类成员的方法和访问常规类成员的方法一致,要采用类成员访问运算符“.”或者“-”。例如:Value1val_a;/联合类Value1的类对象Value1*p=newValue1;/联合类Value1的类对象的指针val_a.ival=100;p-cval=Y;,6.2典型实例练能力,6.2.1典型实例一:整数集合的操作【实例题目】设计一个整数集合类,具有置空、添加元素、判断元素是否在集合中、求交集、输出显示集合元素等功能。,6.2.2典型实例二:简单的图书信息管理系统,【实例题目】利用链表结构实现一个简单的图书信息管理系统,具有输入图书信息、显示库存图书信息和借出图书等操作,显示的信息包括图书的书名、作者和可借数量。,6.3上机练习重应用,6.3.1上机练习一:复数的运算(一)【练习题目】编写一个程序用于模拟复数的加、减、乘、除运算。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!