【知识点总结】第四章 类与对象

  • 面向对象程序设计的基本概念和特征

抽象性:对对象进行归纳,抽出一类对象的公共性质并加以描述的过程。【数据抽象、行为抽象】程序员

封装性:将抽象获得的数据、行为、功能相结合,造成一个有机的总体。就是将数据与操做数据的函数代码进行有机结合造成“类”,其中的数据和函数都是类的成员。编程

   经过封装,对成员访问权限合理控制,使得不一样类之间的相互影响减小到最低限度,进而加强数据的安全性和简化程序编写工做安全

继承性函数

多态性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修饰的成员数据:

注意:①对于某个具体对象而言,该数据为常量,不能修改;②其初始化只能在类构造函数的初始化表中进行。

相关文章
相关标签/搜索