抽象性:对对象进行归纳,抽出一类对象的公共性质并加以描述的过程。【数据抽象、行为抽象】程序员
封装性:将抽象获得的数据、行为、功能相结合,造成一个有机的总体。就是将数据与操做数据的函数代码进行有机结合,造成“类”,其中的数据和函数都是类的成员。编程
经过封装,对成员访问权限合理控制,使得不一样类之间的相互影响减小到最低限度,进而加强数据的安全性和简化程序编写工做。安全
继承性函数
多态性spa
类的定义和实现设计
class 类名 { public: 公有成员(数据成员和函数成员) private: 私有成员(数据成员和函数成员) protected: 保护型成员(数据成员和函数成员) };
其中,public成员是类与外部的接口。3d
举例:code
类的成员函数实现的通常语法形式(成员函数的实现写在类的定义外面的情形):对象
返回值类型 类名::函数成员名(形参列表)
{
函数体
}
其中,双冒号称为二元做用域运算符。blog
举例:
注意:
关于类的成员数据:
① 定义方法与普通变量相同,只是它必须被定义在类内部。
② 在类内部,成员数据只能被定义,但不能被初始化。
关于类的成员函数:
若是在类内部仅声明函数原型,在类外部定义函数体,则必须使用二元做用域分辨符::
声明内联成员函数:
方法1: 成员函数的函数体定义在类内部
方法2: 使用关键字inline
对象的定义和使用
对象是类的实例。即,对象是类的变量。【关于对象的使用,能够参考结构体成员的使用。】
对象的定义:类名 对象名;
对象的使用:使用对象名.成员名的形式访问共有成员。
类的构造函数和析构函数
构造函数:
介绍:① 是特殊的成员函数。 ② 用于在建立对象时为对象分配内存 ,并能够将其初始化到特定的状态。
性质:① 构造函数的函数名与类名相同。
② 构造函数无返回值,因此不能设定返回类型,即便是void也不能够。
③ 构造函数是在建立对象时由编译器自动调用的。
④ 构造函数能够是内联函数、重载函数或带默认形参值的函数。
举例:
①用户未定义构造函数的情形:
main函数中定义对象时,系统隐含调用了默认的构造函数。但,只能完成内存分配,却没法进行初始化。
②用户定义一个不带参数的构造函数:
在main函数中定义对象时,系统隐含调用了用户自定义构造函数。
③用户定义一个带参数的构造函数
实际定义对象时,也要带有参数,不然,编译系统报错。
④用户定义一个带默认形参值的构造函数:
在main函数中,定义myclock时使用用户给的实参完成初始化。 定义hisclock时使用构造函数中默认形参值进行初始化。
⑤展现构造函数是被编译系统自动调用的:
main函数中定义对象时,主函数中并无显式调用构造函数的代码。 但运行截图可见,构造函数中的提示被输出了。
⑥构造函数的重载
编译器根据建立对象时实参状况,自动调用最佳匹配的构造函数。
定义myclock处,编译器自动调用不带参数的构造函数;
定义hisclock处,编译器自动调用带参数的构造函数。
main函数中,
定义myclock处,存在歧义。 编译器无从选择哪个为最佳匹配的构造函数。
定义hisclock 处,编译器根据建立对象时实参状况,自动调用最佳匹配的构造函数,即带参数的构造函数。
注意:
① 在一个类的定义中,能够包含多个构造函数。这些构造函数有相同的函数名称,但具备不一样的形参列表。
② 定义对象时,编译器会根据参数的个数、类型来决定调用哪个重载构造函数。
③ 当重载不带参数的构造函数和带默认形参值的构造函数时,程序可能会产生二义性。所以,在实际编程中应避免这一情形。
复制构造函数:
① 是特殊的构造函数:其形参是本类对象的引用。
② 复制构造函数在下述情形被调用: 使用已有的对象初始化一个新的对象。
语法形式:
举例:
①用户自定义复制构造函数:
主函数中,定义myclock时,编译器自动调用带参数的构造函数,并使用定义对象时的实参进行初始化。
定义hisclock时,编译器自动调用复制构造函数,用已存在的对象myclock初始化。
②展现复制构造函数被编译系统自动调用:
主函数中,定义myclock和hisclock时,主函数中并无显式调用构造函数和复制构造函数。 但运行截图可见,两个函数里的信息都被输出了。 所以,不管是构造函数,仍是复制构造函数,都是由编译器负责自动调用的。
注意:
① 复制构造函数有且只有一个形参,并且这个形参必须是本类对象的引用。
② 若是用户没有自定义复制构造函数,在必要的时候,编译器会自动建立一个默认的复制构造函数。
③复制构造函数多用const来代表常引用,此时使用值但不修改值,例:Clock::Clock ( const Clock &t );
复制构造函数会被自动调用的状况:
① (显式)用已存在的对象初始化该类的另外一个对象时:
②函数形参为类对象,函数调用实参赋值给形参时:
主函数中调用了形参为类对象的函数,将实参赋值给形参。参数传递过程当中, 复制构造函数被调用。
③函数返回值为类对象时:
函数中的返回值为类对象,复制构造函数被调用了。
析构函数
① 是特殊的成员函数
② 用于释放对象所占的内存及完成相关的“清理”工做
③析构函数的函数名为“~ 类名”。
④析构函数既没有参数,也没有返回类型。
⑤析构函数是在对象生存期结束时由编译器自动调用的。
⑥析构函数不能被重载,所以任意类中只有一个析构函数。
⑦若程序员没有自定义析构函数,编译器会自动地建立一个默认的析构函数。
类的组合是指类中的成员数据是另外一个类的对象。
由此,在已有的抽象和封装的基础上,实现更复杂的抽象与封装,以对应现实世界的复杂模型。
类Line的成员p1, p2是另外一个类Point的对象。
类的组合中,关于函数调用顺序:
① 先调用内嵌对象的构造函数,再调用本类对象的构造函数。
若是有多个内嵌对象,按照内嵌对象在组合类中的声明顺序依次调用,即先声明者先构造。
② 析构函数的调用顺序,与构造函数的调用顺序相反。
③因为复制构造函数是特殊的构造函数,因此,其调用顺序与构造函数相同,也是先调用内嵌对象的复制构造函数,再调用本类对象的复制构造函数。
① 结构体和共用体都属于自定义类型。支持把逻辑上相互关联的数据和操做放在一块儿。
② C++中的结构体与共用体,与C彻底兼容。
③ C++中的结构体与共用体,相较于C,新增了成员函数和访问控制权限。所以,能够看做是特殊形态的类。
注意:类与结构体的区别是访问权限,结构体默认public,而类默认private。
结构体:
① C++中的结构体 vs. C中的结构体
a) 写法上,结构体类型名不须要关键字struct
b) C++中的结构体,内部能够有成员函数。
② C++中的结构体 vs. C++中的类
a) 结构体中的成员,默认访问权限为public
b) 类的成员,默认访问权限为private
共用体:
① C++中的联合体 vs. C中的联合体
a)写法上,联合体类型名不须要关键字union
b) C++中的联合体,内部能够有成员函数,但使用很少
② C++中的联合体 vs. C++中的结构体
a)联合体中的数据成员共享同一组内存单元
b)联合体对于自定义构造/析构函数、重载、继承、多态等方面有所限制
const修饰的成员函数:
注意:①只能使用数据成员,不能修改;②不能调用非const成员函数
const修饰的成员数据:
注意:①对于某个具体对象而言,该数据为常量,不能修改;②其初始化只能在类构造函数的初始化表中进行。