- 面向对象程序设计的基本概念和特征
抽象性:对对象进行概括,抽出一类对象的公共性质并加以描述的过程。【数据抽象、行为抽象】
封装性:将抽象得到的数据、行为、功能相结合,形成一个有机的整体。就是将数据与操作数据的函数代码进行有机结合,形成“类”,其中的数据和函数都是类的成员。
通过封装,对成员访问权限合理控制,使得不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序编写工作。
继承性
多态性
-
类的定义和实现
class 类名 { public: 公有成员(数据成员和函数成员) private: 私有成员(数据成员和函数成员) protected: 保护型成员(数据成员和函数成员) };
其中,public成员是类与外部的接口。
举例:
类的成员函数实现的一般语法形式(成员函数的实现写在类的定义外面的情形):
返回值类型 类名::函数成员名(形参列表)
{
函数体
}
其中,双冒号称为二元作用域运算符。
举例:
注意:
关于类的成员数据:
① 定义方法与普通变量相同,只是它必须被定义在类内部。
② 在类内部,成员数据只能被定义,但不能被初始化。
关于类的成员函数:
如果在类内部仅声明函数原型,在类外部定义函数体,则必须使用二元作用域分辨符::
声明内联成员函数:
方法1: 成员函数的函数体定义在类内部
方法2: 使用关键字inline
-
对象的定义和使用
对象是类的实例。即,对象是类的变量。【关于对象的使用,可以参考结构体成员的使用。】
对象的定义:类名 对象名;
对象的使用:使用对象名.成员名的形式访问共有成员。
-
类的构造函数和析构函数
构造函数:
介绍:① 是特殊的成员函数。 ② 用于在创建对象时为对象分配内存 ,并可以将其初始化到特定的状态。
性质:① 构造函数的函数名与类名相同。
② 构造函数无返回值,所以不能设定返回类型,即使是void也不可以。
③ 构造函数是在创建对象时由编译器自动调用的。
④ 构造函数可以是内联函数、重载函数或带默认形参值的函数。
举例:
①用户未定义构造函数的情形:
main函数中定义对象时,系统隐含调用了默认的构造函数。但,只能完成内存分配,却无法进行初始化。
②用户定义一个不带参数的构造函数:
在main函数中定义对象时,系统隐含调用了用户自定义构造函数。
③用户定义一个带参数的构造函数
实际定义对象时,也要带有参数,否则,编译系统报错。
④用户定义一个带默认形参值的构造函数:
在main函数中,定义myclock时使用用户给的实参完成初始化。 定义hisclock时使用构造函数中默认形参值进行初始化。
⑤展示构造函数是被编译系统自动调用的:
main函数中定义对象时,主函数中并没有显式调用构造函数的代码。 但运行截图可见,构造函数中的提示被输出了。
⑥构造函数的重载
编译器根据创建对象时实参情况,自动调用最佳匹配的构造函数。
定义myclock处,编译器自动调用不带参数的构造函数;
定义hisclock处,编译器自动调用带参数的构造函数。
main函数中,
定义myclock处,存在歧义。 编译器无从选择哪一个为最佳匹配的构造函数。
定义hisclock 处,编译器根据创建对象时实参情况,自动调用最佳匹配的构造函数,即带参数的构造函数。
注意:
① 在一个类的定义中,可以包含多个构造函数。这些构造函数有相同的函数名称,但具有不同的形参列表。
② 定义对象时,编译器会根据参数的个数、类型来决定调用哪一个重载构造函数。
③ 当重载不带参数的构造函数和带默认形参值的构造函数时,程序可能会产生二义性。因此,在实际编程中应避免这一情形。