一.C++语言的面向对象的基本特征
1.面向对象语言的三个基本特征
- 封装性:将类内部细节隐藏,对外暴露公有或保护类型的函数作为接口。
- 继承性:特殊类对一般类的继承,又叫子类对父类的继承。又叫派生类对基类 的继承。
- 多态性:子类从父类继承来的成员或者函数可以再次编辑更改,使具有不同的 表现行为。
2.类的声明
- 以关键字class为开头,class 类名 { };
- 成员函数的声明和定义位置有两种:
- 成员函数的声明和定义都放在类中,此时要求函数定义语句一般不超过三行。
- 成员函数的声明放在类中,其定义放在类外,此时情况为(函数定义语句 比较多)或(不想让别人看到函数实现的具体
代码),成员函数在类外定义时 要加类作用域,格式如下:返回值 所属类 ::函数名(){ }
- 类声明和成员函数的定义分离到不同的文件中,类声明放到 .h 文件中,成员函 数定义放到 .cpp 文件中,且成员函数 所在的 .cpp 文件中要包含类所在的 .h 文件
3.类的封装与访问限定符
-
一般情况,类的成员变量为私有,成员函数为公有。
-
三个访问限定符:
public: 公有的,可以在任何情况下访问成员变量或函数
private: 私有的,只能在类内部被访问,在外访问不了。
protected: 受保护类型,不能被类外访问,只能让其子类(派生类)通过继承 来访问。默认是private。且三个无顺序要求,一个限定符在类中可以出现多次。
4.构造函数
- 目的:用来初始化类的成员变量
- 要求:构造函数的名字必须与类名相同
构造函数没有任何返回值,且函数名前不能加void, 因为void也是一种有返回值的,只不过为空。
5.函数重载
- 函数名相同
- 函数的参数列表不同,仅仅返回值不同不叫重载
6.析构函数
- 定义:与构造函数作用相反的特殊函数,其名字为类名的前面加一个“ ~ ”(取反)
- 特点:析构函数只有一个
析构函数没有参数,没有返回值 - 析构函数什么时候被调用
(1)如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数
(2)static 局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main 函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
(3)如果定义了一个全局对象,则在程序的流程离开其作用域时(如mian函数结束或调用exit函数)时,调用该全局对象的析构函数。
(4)如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象 时,先调用该对象的析构函数。
7.静态成员
- 实现数据共享和传递有两种方式,一是定义全局变量,但全局变量不安全,可任意被修改;另外一种是定义静态变量,即在成员变量前加static,使其变为共享的成员变量,访问该静态成员变量的函数称为静态成员函数,而且静态成员函数只能访问静态成员变量。静态成员变量和静态成员函数可以通过
类::静态成员变量(函数)来访问,也可通过 对象.静态成员变量(函数)来访问。
8.this指针
- 定义:指向本类对象的指针。
9.对象的动态建立和释放
-
使用new运算符动态创建对象:使用new创建对象返回的是对象指针
-
使用delete运算符销毁对象:delete 对象;
注意:new和delete是运算符而不是关键字
注意:有new一定要在同一个函数下有delete,否则会造成对象指针不被释放,造成内存泄漏,后果很严重。
二.继承与派生
1.继承概念与声明
- 类继承格式 class 子类名称 : 继承方式 父类名称
2.派生类成员访问
- 继承的三种方式:
- 公有继承:基类的公有成员在派生类中仍是公有成员,基类的保护成员在派生类中 仍是保护成员,基类的私有成员不能被继承,仍为基类私有。
- 私有继承:基类的公有成员和受保护成员在派生类中都成了私有成员,基类的私有 成员仍为基类私有,不能被访问。
- 受保护的继承:基类的公有成员和受保护成员在派生类中都成了保护成员,基类的 私有成员仍为基类私有。受保护成员就是不能被外界引用访问,但可以被派生类的 成员访问,即可被继承。
3.派生类构造函数
- 1.派生类构造函数的一般形式: 派生类构造函数名(总参数列表): 基类构造函数名(参数列表)【调用基类 构造函数,直接传参不用加参数数据类型】 { 派生类中新增数据成员初始化语句; }
(要注意其中参数列表的对应顺序,总参数列表顺序为派生类参数再基类参数,要传递给基类的参数名要与派生类参数名 一定要相同 )
三:多态与虚函数
1.多态概念
- 定义: 多态性是指子类从父类继承来的成员函数在父类及其各个子类具有不同的表现形式。
- 多态有两种实现方式
- 编译时多态:通过函数重载实现,函数重载就是在一个类中有多个名字相同但 参数列表不同的函数,这些函数共同构成重载关系,注意,仅仅只是返回值不 同的两个函数不能同时存在,也不是函数重载。函数重载好处是大大减少函数名数量,将具有相同功能的函数命名为相同的名字。其中参数列表不同有两种 形式:参数个数不同 和 参数类型不同。
- 运行时多态:通过虚函数来实现,且大部分的多态都是通过虚函数的运行时多 态来实现的。虚函数:只有函数声明,没有具体函数实现。即在成员函数声明 前加一个virtual 。虚函数可以在派生类中被重写。
2.虚函数的访问
- 通过基类指针,执行时会根据指针指向的对象的类,决定调用哪个函数。
- 采用对象调用虚函数,则采用的是静态联编方式,它与基类指针访问是相反的。
3.纯虚函数
- 在基类中声明但是没有定义的虚函数,而且设置函数值等于零,纯虚函数格式为: virtual <函数返回类型> <虚函数名> (
<参数列表> ) = 0 (去掉函数定义大括 号直接等于0就行,虚函数存在目的就是在子类中重写它)