- 面向对象程序设计的基本特点
- 抽象
- 在面向对象的软件开发中,首先注意的是问题的本质及描述,其次是解决问题的具体过程。
- 对一个问题的抽象包括两个方面:数据抽象和行为抽象
- 封装
- 继承
- 多态
- 特殊多态性:表面的多态性
- 强制多态 数据类型转换(显式或隐式)
- 重载多态 函数重载 运算符重载
- 一般多态性:真正的多态性
- 类型参数化多态 模板(函数模板和类模板)
- 包含多态 虚函数(多态的精华)
- 特殊多态性:表面的多态性
- 抽象
- 类和对象
- 类成员的访问控制
- 如果私有成员紧接着类名称,则关键字 private 可以省略。
- 一般情况下,一个类的数据成员都应该声明为私有成员,这样,内部数据结构就不会对该类以外的其余部分造成影响,程序模块之间的相互作用就被降低到最小。
- 保生户类型成员的性质和私有成员的性质相似,其差别在于继承过程中对产生的新类影响不同。
- 设计一个类,是为了用它,要能够使用,就一定要设计必要的外部接口。
- 具有不同访问属性的成员,可以按任意顺序出现。修饰访问属性的关键字也可以多次出现。
- 在书写时通常习惯将公有类型放在最前面,这样便于阅读,因为它们是外部访问时所要了解的。
- 对象
- 对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存中只占据一份空间。
- 类的成员函数
- 类的成员函数实现用类名来控制 返回值类型 类名::函数成员名(参数表)
- 类的成员函数调用用对象名来控制
- 类的成员函数中,可以访问当前类的对象的私有成员
- 类成员函数的默认值一定要写在类定义中,而不能写在类定义之外的函数实现中
- 内联函数的声明有两种方式:隐式声明和显式声明。
将函数体直接放在类体内,这种方法称之为隐式声明。
为了保证类定义的简洁,可以采用关键字 inline 显式声明的方式。即在函数体实现时,在函数返回值类型前加上 inline ,类定义中不加入函数体
- 类成员的访问控制
- 构造函数
- 通常情况下,类的所有数据成员对象都是通过构造函数确定的,可以是通过构造函数传参数传进去的,也可以在构造函数中进行计算得到
- 有时函数体为空的构造函数并非不做任何事情,因为它还要负责基类的构造和成员对象的构造
- 一般,如果定义了有参数的构造函数,应该再定义无参数的构造函数
- 复制构造
- 形参是本类对象的引用
- 调用复制构造的三种情况
- 用类的一个对象初始化该类的另一个对象 b(a) c=a 两种写法执行的操作完全相同
- 函数形参是类的对象,值传递 引用传递不会调用复制构造,适合传递较大的对象
- 函数返回值是类的对象
- 函数返回值是函数的局部对象,离开函数它就消亡了,不可能在返回主调函数后继续生存,编译系统会在主调函数中创建一个无名临时对象,该临时对象的生存期只在函数调用的表达式中,执行被调函数的return语句时,调用复制构造将函数返回值复制到临时对象
- 编译器有时会针对复制构造函数的调用做优化,避免不必要的复制构造函数调用。
- 如果复制构造和隐含的复制构造功能一样,都是把原对象的数据一一赋给新对象中对应的数据成员,则没必要再写复制构造函数
- 自定义复制构造函数可以复制原对象的一部分内容,也可以有变化地复制
- 如果成员数据有指针,要实现深复制,要重新写自定义复制构造函数
- 复制构造与赋值
-
赋值运算符(=)作用于一个已存在的对象;而拷贝构造函数会创建一个新的对象。
-
- 析构函数
- 析构函数不接受任何参数,但可以是虚函数
- 函数体为空的析构函数未必不做任何事情
- 类的组合
- 一个类内嵌其他类的对象作为成员
- 组合类的构造函数
- 组合类构造函数定义的一般形式为:
类名::类名(形参表) :内嵌对象 1 (形参表) ,内嵌对象 2 (形参表), ... - 组合类构造函数的调用顺序:
- (1)调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的次序。注意,内嵌对象在构造函数的初始化列表中出现的顺序与内嵌对象构造函数的调用顺序无关。
- (2)执行本类构造函数的函数体。
- 如果有些内嵌对象在构造函数的初始化列表中没有出现,那么在(1)中该内嵌对象的默认构造函数将被执行
- 含有内嵌对象的默认构造函数被调用时,内嵌对象的默认构造函数也会被调用
- 有些数据成员的初始化,必须在构造函数的初始化列表中进行
- 一类是那些没有默认构造函数的内嵌对象一一因为这类对象初始化时必须提供参数
- 另一类是引用类型的数据成员 因为引用型交量必须在初始化时绑定引用的对象。
- 如果一个类包括这两类成员,那么编译器不能够为这个类提供隐含的默认构造函数,这时必须编写显式的构造函数,并且在每个构造函数的初始化列表中至少为这两类数据成员初始化。
- 组合类构造函数定义的一般形式为:
- 组合类的析构函数顺序和构造函数恰好相反
- 组合类的复制构造
- 默认的组合类的复制构造会自动调用内嵌成员的复制构造
- 如果要为组合类写复制构造,则要为内嵌成员对象的复制构造传递参数
- 前向引用声明
- 前向引用声明,是在引用未定义的类之前,将该类的名字告诉编译器,使编译器知道那是一个类名。
- 尽管使用了前向引用声明,在提供完整定义之前,不能定义该类的对象,不能使该类的对象为其它类的数据成员,不能在内联函数中使用该类的对象。可以声明该类的对象引用或指针,可以在非内联函数中使用该类的对象,并在给出该类的完整定义后再给出函数的定义