c教程-类的设计和继承

上传人:tian****1990 文档编号:74762882 上传时间:2019-01-29 格式:PPT 页数:25 大小:808.81KB
返回 下载 相关 举报
c教程-类的设计和继承_第1页
第1页 / 共25页
c教程-类的设计和继承_第2页
第2页 / 共25页
c教程-类的设计和继承_第3页
第3页 / 共25页
c教程-类的设计和继承_第4页
第4页 / 共25页
c教程-类的设计和继承_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《c教程-类的设计和继承》由会员分享,可在线阅读,更多相关《c教程-类的设计和继承(25页珍藏版)》请在金锄头文库上搜索。

1、C+编程,2,课程目标,学习c+基本知识和技能 要求学员能正确的理解和运用c+基本知识和技能,3,课程分为如下几块,C+单个类的设计 C+类的继承 容器和算法 IO流 C+的异常处理 Qt Qt扫雷项目,4,第一部分 c+类的设计,预习检测 什么是引用? 引用必需要初始化吗? 定义类的友元函数的关键字是什么? C+的显式转换有哪几种定义? 复制控制包含那几个函数?,5,第一部分 c+概述,C+是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的 C+保留了C语言原有的所有优点, 增加了面向对象的机制 C+是由C发展而

2、来的, 与C兼容 用C语言写的程序基本上可以不加修改地用于C+ 从C+的名字可以看出它是C的超越和集中 C+既可用于面向过程的结构化程序设计, 又可用于面向对象的程序设计, 是一种功能强大的混合型的程序设计语言 C+是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。 面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率不要把面向对象和面向过程对立起来, 面向对象和面向过程不是矛盾的,而是各有用途互为补充的 包括类和对象的概念、类的机制和声明、类对象的定义与使用等。这是面向对象

3、的程序设计的基础。基于对象就是基于类。与面向过程的程序不同,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。 在C+中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。类是抽象的,不占用内存,而对象是具体的,占用存储空间。,6,第一部分 c+类的设计,第一节 引用 引用是变量的别名, 与被引用的变量表示同一个对象 通过引用可以改变被引用对象的值 引用必须被初始化 const引用表示被引用的对象是只读体 &符号的多种含义 小结 引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间

4、不如意的问题。 用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。 引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。,7,第一部分 c+类的设计,第二节 类的设计 通常将类的定义及类成员函数的声明放在头文件, 类的成员函数实现放在源文件中 类的定义: 关键字class, 类中包含数据和操作数据的函数 成员访问限定符: public, private, protected, 类的作用域 变量, 对象, 类

5、, 类型的概念 类的构造函数, 析构函数 Inline函数:关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。定义在类声明之中的成员函数将自动地成为内联函数,内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 This指针: this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址。全局仅有一个this指针,当一个对象被创建时,this指针就指向对象数据的首地址, this指针指向的是对象自身。 函数的重载:指在同一作用域内,可以有一组具有相同函

6、数名,不同参数列表的函数,这组函数被称为重载函数。 多态: 多态性包含编译时的多态性、运行时的多态性两大类。 即:多态性也分静态多态性和动态多态性两种。,8,第一部分 c+类的设计,第三节 new和delete运算符用于动态分配和撤销内存的运算符 1. 开辟单变量地址空间 new的作用:分配足够的内存以便容纳所需类型的对象,调用构造函数初始化内存中的对象 1)int * a = new int; /开辟一个存放数组的存储空间,返回一个指向该存储空间的地址. 2)int *a = new int(5); / 作用同上,但是同时将整数赋值为5 2. 开辟数组空间 一维: int *a = new

7、int100;/开辟一个大小为100的整型数组空间 二维: int(*a)6=new int56; Delete的作用: 调用对象的析构函数, 在释放对象 1. int *a = new int; delete a; /释放单个int的空间 2.int *a = new int5; delete a; /释放int数组空间,9,第一部分 c+类的设计,第四节 类型转换 隐式类型的转换 int a = 1; double b = 0.1 double c = a+b; 指针转换: int a3; int * b = a; 转换为bool 类型 算术值和指针值都可以转换为 bool 类型。 Int

8、 * a = 0; If(a) cout “a is true”; else cout “a is false”;,10,第一部分 c+类的设计,C+的显式转换 static_cast 程序员显式的强制类型转换 int a = 10; double b = static_cast(a); double c = (double)a; reinterpret_cast:为操作数的位模式提供较低层次的重新解释 int b = 1; int a = (int) / C-language-style cast notation,11,第一部分 c+类的设计,第五节 友元及static 友元机制: 允许一

9、个类将对其非公有成员的访问权授予指定的函数或类 优点: 在实现类之间数据共享时,减少系统开销,提高效率; 缺点:友元函数破环了封装机制,尽量不使用友元函数. 因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。可以直接调用友元函数,不需要通过对象或指针. 成员函数有this指针,而友元函数没有this指针。 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友 static函数和static数据成员 非static成员存在于类的对象中, static数据成员是独立于类的对象的, 它是于类相关联的. 通过作用域操作符:直接调用static成员. static数据成员必须

10、在类定义体外部定义一次. 静态成员函数访问类成员数据和类static数据成员的区别。,12,第一部分 c+类的设计,第六节 复制控制 复制控制: 复制构造函数, 析构函数, 赋值操作符. 析构函数在撤销类对象时自动调用 class Person public: Person(const string ,13,第一部分 c+类的设计,第七节 操作符重载 一般将算术和关系操作符定义非成员函数,而将赋值操作符定义为成员操作符。定义为非成员函数时,通常必须将它们设置为所操作类的友元 operator+(); operator+=(); operator=(); operator!=(); 重载赋值运算

11、符时应返回一个对象。因为赋值运算符的左边是一个对象,所以重载赋值运算符应返回一个类的对象,为了避免不必要的开销,最好是返回一个类的对象的引用。 重载赋值运算符时必须是类的成员函数。 复数类演示代码 输入和输出操作符 ostream& operator (istream& in, ClassType& s),14,第一部分 c+类设计总结,C+单个类的设计中讲述的主要内容有: 引用 c+类的定义 类和对象的关系 c+封装的概念 函数的重载 类操作符的重载 类静态函数和类静态成员数据 类的复制控制 类的友元函数 c+类型的转换,15,第二部分 c+类的继承,预习检查 子类可以访问父类私有成员数据吗

12、? 如何定义虚函数? 多态有两种实现方式是?,16,第二部分 c+类的继承,第一节 类的继承: 类的继承是概念的延续,子类和父类一般都是概念扩展的关系,我们通常把这种关系称为“是”关系。比如:本科生是学生,自行车是交通工具。而对象的组合是因功能需求产生的从属关系,我们通常把这种关系称为“有”关系。比如:链表有一个头结点,电脑有一个中央处理器等等。 继承的方式: 公有继承(public)、私有继承(private)、保护继承(protected) private(私有)和protected(保护)都能实现类的封装性。private能够对外部和子类保密,即除了成员所在的类本身可以访问之外,别的都不

13、能直接访问。protected能够对外部保密,但允许子类直接访问这些成员。public、private和protected对成员数据或成员函数的保护程度可以用下表来描述:,17,第二部分 c+类的继承,类成员函数的访问 函数的继承, 函数的覆盖 , 函数的重定义 在父类中有的方法虽然会被子类继承,但将来在子类使用时可能有不同的实现机制,这时候就需要在父类中声明该方法时加上virtual关键字 多态方法之一: 子类改写父类中方法的内部实现,18,第二部分 c+类的继承,class Biology public: void eat() cout “bio eat!“ endl; virtual v

14、oid letOff() cout “bio lef off!“ endl; virtual void move() cout “bio move!“ endl; ; class Animal: public Biology public: void eat() cout “animal eat!“ endl; void letOff() cout “animal lef off!“ endl; ;,19,第二部分 c+类的继承,int main() Animal tiger; tiger.eat(); /函数的覆盖 tiger.letOff(); /函数的重定义 tiger.move();

15、/函数的继承 Biology * bio = 触发动态绑定的两个条件: 第一,只有指定为虚函数的成员函数才能进行动态绑定 第二,必须通过基类类型的引用或指针进行函数调用。 多态有两种实现方式是: 一是同一个类中函数的重载; 二是子类改写父类中方法的内部实现。,20,第二部分 c+类的继承,派生类到基类的转换 如果有一个派生类型的对象,则可以使用它的地址对基类类型的指针进行赋值或初始化。 基类到派生类的转换: 从基类到派生类的自动转换是不存在的。 class A ; class B: public A ; int main() A * pa = new B; /B * b = pa;/报错 B

16、* b = static_cast(pa); return 0; ,21,第二部分 c+类的继承,第二节派生类构造函数 派生类的构造函数受继承关系的影响,每个派生类构造函数除了初始化自己的数据成员之外,还要初始化基类。子类的构造函数定义中用以下格式调用父类的构造函数: 子类名:构造函数名(参数表):父类名(参数表) class Base public: Base(int i =0 ): m_i(i) protected: int m_i; ; class Derive : public Base public: Derive(int i =0, const string ,22,第二部分 c+类的继承,复制控制和继承 class Person public: Person(const string

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号