学堂在线C++程序设计第五章学习笔记
类与对象
对象:现实中对象的模拟,具有属性和行为。
类:同一类对象的共同属性和行为
定义对象时:通过构造函数初始化
删除对象时:通过析构函数释放资源
面向对象程序的基本特点
抽象:对同一类对象的共同属性和行为进行概括,形成类
封装:将抽象出的数据,代码封装在一起,形成类
继承:在已有类的基础上,进行扩展形成新的类
多态:同一名称,不同的功能实现方式
类和对象
设计类就是设计类型
- 此类型的“合法值”是什么
- 此类型应该有什么样的函数和操作符
- 新类型的对象该如何被创建和销毁
- 如何进行对象的初始化和赋值
- 对象作为函数的参数如何以值传递
- 谁将使用此类型的对象成员
类定义的语法形式
class 类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护型成员
}
类的成员函数
- 在类中声明函数原型
- 可以在类外给出函数体实现,并在函数名前使用类名加以限定
- 也可以直接在类中给出函数体,形成内联成员函数
- 允许声明重载函数和带默认参数值得函数
构造函数
类中的特殊函数
用于描述初始化算法
作用:
- 在对象被创建时使用特定的值构造对象,将对象
初始化
为一个特定的初始状态
形式:
- 函数名与类名相同
- 不能定义返回值类型,也不能有return语句
- 可以有形式参数,也可以没有形式参数
- 可以是内联函数
- 可以重载
- 可以带默认参数值
调用时机
- 在对象创建时被自动调用
- 例如:
Clock myClock(0,0,0)
默认构造函数
- 调用时可以不需要实参的构造函数
- 参数表为空的构造函数
- 全部参数都有默认值的构造函数
隐含生成的构造函数
- 如果程序中未定义构造函数,编译器将自动生成一个默认构造函数
- 参数列表为空,不为数据成员设置初始值
- 如果类内定义了成员的初始值,则使用内类定义的初始值
- 如果没有定义类内的初始值,则以默认方式初始化
- 基本类型的数据默认初始化的值是不确定的
复制构造函数
- 复制构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已存在的对象去初始化同类型的新对象。
class 类名{
public:
类名(const 类名 &对象名); //复制构造函数
}
类名::类(const 类名 &对象名) {
函数体
}
复制构造函数被调用的三种情况
- 定义一个对象时,以本类另一个对象作为初始值,发生复制构造
- 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造
- 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造
隐含的复制改造函数
- 如果没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的复制构造函数
- 这个构造函数执行的功能是:用初始值对象的每个数据成员,初始化将要建立的对象的对应数据成员
析构函数
- 完成对象被删除前的一些清理工作。
- 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
- 如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。
- 析构函数的原型:~类名()
- 析构函数没有参数,没有返回类型
类的组合
- 类中的成员是另一个类的对象
- 可以在已有抽象的基础上实现更复杂的抽象
类组合的构造函数设计
- 原则:不仅要对本类中的基本类型成员数据初始化,也要对对象成员初始化
- 声明形式:
类名::类名(对象成员所需的形参,本类成员的形参):
对象1(参数),对象2(参数),...
{
//函数体
}
构造组合类对象时的初始化次序
- 首先对构造函数初始化列表中列出的成员(包括基本类型和对象成员)进行初始化,初始化次序是成员在类体中定义的次序
- 成员对象构造函数调用顺序:按对象成员的定义顺序,先声明者先构造
- 初始化列表中未出现的成员对象,调用默认构造函数(即无形参)的初始化
- 处理完初始化列表后,再执行构造函数的函数体
结构体
结构体是一种特殊形态的类
与类的唯一区别
- 类的缺省访问权限是private
- 结构体的缺省访问权限是public
什么时候用结构体
- 定义主要用来保存数据,而没有什么操作的类型
- 人们习惯将结构体的数据成员设为公有,因此这时用结构体更方便
定义
struct 结构体名称{
共有成员
protected:
保护型成员
private:
私有成员
}
结构体中可以有数据成员和函数成员
结构体的初始化
如果:
- 一个结构体的全部数据成员都是公共成员
- 没有用户定义的构造函数
- 没有基类和虚函数
这个结构体的变量可以用下面的语法形式初始化
类型名 变量名 = {成员数据1初始值,…}
联合体
定义
union 联合体名称{
共有成员
protected:
保护型成员
private:
私有成员
}
特点:
- 成员共用同一组内存单元
- 任何两个成员不会同时有效
枚举类
定义
enum class 枚举类型名:底层类型{枚举值列表}
例子:
enum class Type{General,Light}
enum class Type:char{General,Light}
枚举类的优势
- 强作用域:作用域限制在枚举类中
- 转换限制:枚举类对象不可以与整型隐式转换
- 可以指定底层类型