本文已参与「新人创作礼」活动,一起开启掘金创作之路。
文章目录
第十章 类
本文记录CCPlus第十章内容,开始进入c++精彩部分
知识整理
过程性编程和面向对象编程
采用过程性编程方法时,首先考虑要遵循的步骤,然后考虑如何表示这些数据。
采用OOP方法时,首先从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后,使用新的设计方案来创建出程序。
抽象和类
类将抽象传换为用户定义类型,将数据表示和操作数据的方法组合成一个整洁的包。
定义类由两部分组成:
- 类声明:以数据成员的方式描述数据部分,以成员函数的方式描述公有接口
- 类方法定义: 描述如何实现类成员函数
通常c++程序员将接口(类声明)放在头文件中,并将实现(类方法定义)放在源代码文件中。
class className{
private:
data member;
public:
member function prototypes
};
关键字private与public描述了对类成员的访问控制。数据项通常放在私有部分,组成类接口的成员函数放在公有部分。使用类对象的程序可以直接访问公有部分,但不能访问私有部分,只能通过公有成员来访问对象私有成员。
类设计将公有接口与实现细节分开,公有接口表示设计的抽象组件,将实现细节放在一起并将它们与抽象分开,这就称为封装。
接下来就是类方法定义
定义成员函数时,使用作用域运算符来标识函数所属的类
类方法可以访问类的private组件
void Stock::update(double price){
}
要注意的是,定义位于类声明中的函数将自动成为内联函数,若要使定义在类声明外的函数成为内联函数,需要使用关键字inline。
类定义完成后,就能像使用基本内置类型一样创建类对象。
所创建的每个新对象都有自己的存储空间,用于存储内部变量和类成员,但同一个类的所有对象共享同一组方法,即每种方法只有一个副本。
构造函数和析构函数
c++提供了特殊的成员函数——类构造函数与析构函数
类构造函数用于构造新对象,将值赋给它们的数据成员。
c++提供了两种使用构造函数来初始化对象的方式
ClassName food = ClassName{string, int,..};
ClassName gatment {string, int,..};
如果没有提供任何构造函数,则c++将自动提供默认构造函数,在未提供显式初始值时,默认构造函数将创建对象。
定义默认构造函数的方式有两种,一种是给已有构造函数的所有参数提供默认值,另一种方式是通过函数重载来定义另一个构造函数,一个没有参数的构造的函数。
当对象过期时,程序会自动调用析构函数。析构函数完成清理工作。
~ClassName();
通常不应在代码中显式的调用析构函数。
如果创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用
如果创建的是自动存储类对象,则其析构函数在程序执行完代码块时自动调用
如果对象是通过new创建的,则它驻留在栈内存或自由存储区,当使用delete来释放内存时,析构函数自动被调用。
this指针
有时候成员函数可能涉及两个对象,在这种情况下需要使用c++的this指针
this指针指向用来调用成员函数的对象,一般来说,所有的类方法都将this指针设置为调用它的对象的地址。
每个成员函数都有一个this指针,指向调用对象。
对象数组
对象也可以像基本数据类型一样,声明对象数组,且声明方法与标准基本类型数组相同,所以不多说了。
类作用域
在类中定义的名称的作用域都有整个类,它们只在类中是已知的,在类外是不可知的。
使用类成员名时,必须根据上下文使用直接成员运算符.,间接成员运算符->或作用域解析符运算符::
由于常量对于所有对象是相同的,所以可以创建一个由所有对象共享的常量。
有两种方法创建共享常量
- 在类中声明枚举,可以用枚举为整型变量提供作用域为整个类的符号名称
- 使用关键字static,这样常量与其他静态变量存储在一起,而不是存储在对象中。
抽象数据类型
类很适合用于描述ADT,公有成员函数接口提供了ADT描述的服务,类的私有部分和类方法的代码提供了实现,这些实现对类的客户隐藏。
复习题
-
什么是类
类是用户定义的类型的定义。类声明指定了数据将如何存储,同时指定了用来访问和操纵这些数据的方法
-
类如何实现抽象,封装和数据隐藏
们可以使用类方法的公有接口对类对象执行操作,这是抽象。类的数据成员可以是私有额,这意味着只能通过成员函数来访问这些数据,这是数据隐藏。实现的具体细节都是隐藏的,这是封装。
-
对象和类之间的关系是什么
类定义了一种类型,包括如何使用它。对象是一个变量或其他数据对象,并根据类定义创建和使用。类和对象之间的关系同标准类型与其变量之间的关系相同。
-
除了是函数以外,类函数成员与类数据成员之间的区别是什么
如果创建给定类的多个对象,则每个对象都有其自己的数据内存空间,但所有的对象都使用同一组成员函数。通常,方法是公有的,数据是私有的。
-
类构造函数和析构函数在何时被调用
在创建类对象或显式调用构造函数时,调用构造函数。当对象过期时,调用析构函数。
-
什么是默认构造函数,拥有默认构造函数的好处
默认构造函数是没有参数或所有参数都有默认值的构造函数。拥有默认构造函数后,可以声明对象而不进行初始化,即使已经定义了初始化构造函数,也能声明数组。
-
this和*this是什么
this指针是类方法可以使用的指针,指向用于调用方法的对象。因此,this是对象的地址,*this是对象本身。