23 多态与虚函数
23 多态与虚函数 面向对象程序设计有三大特征:封装性、继承性、多态性。 三大特征是互相关联的,多态性必须存在于继承的环境中,是继承性的进一步拓展。 1 多态要解决的问题 让我们稍稍修改下上一节中的代码: #include<iostream> using namespace std; //基类
23 多态与虚函数 面向对象程序设计有三大特征:封装性、继承性、多态性。 三大特征是互相关联的,多态性必须存在于继承的环境中,是继承性的进一步拓展。 1 多态要解决的问题 让我们稍稍修改下上一节中的代码: #include<iostream> using namespace std; //基类
22 继承与派生 1 对继承与派生概念的理解 在面向对象思想一节中,我们使用 “敌人类” 派生出 “弓箭手类” 和 “剑客类” 两种敌人的例子,简单介绍了 继承与派生 的概念,请跳转查看。 2 特别说明 C++ 语言的继承与派生,功能是非常强大的。C++ 支持单继承、多继承,也支持公有继承、保护继承
21 静态成员变量和静态成员函数 1 对象在内存中的分配存储方式 1.1 this 指针 我们知道,创建一个类的对象,程序就会开辟一块内存空间,用于存储这个对象。那么,对象的成员变量和成员函数在内存中,是如何存储的呢? 是像下面这张图一样,每个对象的内存空间都存储着类的成员变量和成员函数吗?
20 对象的动态建立与释放 与普通变量相同,对象也可以使用 new 运算符进行动态存储分配。 1 为什么需要动态建立对象 动态内存分配,分配的内存空间在 “堆” 中,而静态存储分配的内存在 “栈” 中。 如果我们不使用动态存储分配,我们建立的变量和对象,都会保存在 “栈” 中,而 “栈” 的空间并不
19 析构函数 析构函数也是一种特殊的成员函数,它的作用与构造函数相反,是在撤销对象占用的内存空间之前完成一些清理工作,使得这部分内存可以被程序重新分配。 1 语法 与构造函数相似,析构函数也没有函数类型,没有返回值。 与构造函数不同的是,析构函数不可以有参数,而且一个类中只能有一个析构函数,不能重
18 类成员的访问权限以及类的封装 1 要解决的问题 我们来看这样一个例子: #include<iostream> using namespace std; class Student { public: string name; int age; int score;
17 构造函数 1 构造函数的作用 在上一节中,我们定义一个对象后,是通过一一赋值的方式,对其中的属性进行初始化的,这很麻烦。 在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行,用于实现对象初始化。这种特殊的成员函数就是
16 类的声明、对象的定义及使用 1 类的声明 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量(属性)和成员函数(方法)。也就是说,需要先声明一个类,才能定义对应的对象。 类的
15 面向对象思想 1 由 “对象” 引发的误会 女友:听说,你们程序员需要面向对象编程,也没见过你写代码时,面向我呀? 程序员:不是啦,这个面向对象的对象不是你这个对象啦。 女友:什么?你还有其他对象吗? 程序员:(一股寒气袭来) 2 什么是面向对象 面向对象,英文名字叫Object Orient
14 数据类型的别名 1 概述 我们学过了使用 “引用” 来作为变量别名的方法。那么,大家有没有想过,不只是 “变量” ,在 C++ 中, “数据类型” 也是可以起别名的呢? 我们为什么需要给数据类型起别名呢? 使类型名写起来更方便。 我们总会遇到一些特别长的数据类型名,如果我们直接用,写起来很麻烦