《Cpp-Primer-Plus》-第十章 类

146 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

文章目录

第十章 类

博文地址

本文记录CCPlus第十章内容,开始进入c++精彩部分

知识整理

过程性编程和面向对象编程

采用过程性编程方法时,首先考虑要遵循的步骤,然后考虑如何表示这些数据。

采用OOP方法时,首先从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后,使用新的设计方案来创建出程序。

抽象和类

类将抽象传换为用户定义类型,将数据表示和操作数据的方法组合成一个整洁的包。

定义类由两部分组成:

  1. 类声明:以数据成员的方式描述数据部分,以成员函数的方式描述公有接口
  2. 类方法定义: 描述如何实现类成员函数

通常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指针,指向调用对象。

对象数组

对象也可以像基本数据类型一样,声明对象数组,且声明方法与标准基本类型数组相同,所以不多说了。

类作用域

在类中定义的名称的作用域都有整个类,它们只在类中是已知的,在类外是不可知的。

使用类成员名时,必须根据上下文使用直接成员运算符.,间接成员运算符->或作用域解析符运算符::

由于常量对于所有对象是相同的,所以可以创建一个由所有对象共享的常量。

有两种方法创建共享常量

  1. 在类中声明枚举,可以用枚举为整型变量提供作用域为整个类的符号名称
  2. 使用关键字static,这样常量与其他静态变量存储在一起,而不是存储在对象中。

抽象数据类型

类很适合用于描述ADT,公有成员函数接口提供了ADT描述的服务,类的私有部分和类方法的代码提供了实现,这些实现对类的客户隐藏。

复习题

  1. 什么是类

    类是用户定义的类型的定义。类声明指定了数据将如何存储,同时指定了用来访问和操纵这些数据的方法

  2. 类如何实现抽象,封装和数据隐藏

    们可以使用类方法的公有接口对类对象执行操作,这是抽象。类的数据成员可以是私有额,这意味着只能通过成员函数来访问这些数据,这是数据隐藏。实现的具体细节都是隐藏的,这是封装。

  3. 对象和类之间的关系是什么

    类定义了一种类型,包括如何使用它。对象是一个变量或其他数据对象,并根据类定义创建和使用。类和对象之间的关系同标准类型与其变量之间的关系相同。

  4. 除了是函数以外,类函数成员与类数据成员之间的区别是什么

    如果创建给定类的多个对象,则每个对象都有其自己的数据内存空间,但所有的对象都使用同一组成员函数。通常,方法是公有的,数据是私有的。

  5. 类构造函数和析构函数在何时被调用

    在创建类对象或显式调用构造函数时,调用构造函数。当对象过期时,调用析构函数。

  6. 什么是默认构造函数,拥有默认构造函数的好处

    默认构造函数是没有参数或所有参数都有默认值的构造函数。拥有默认构造函数后,可以声明对象而不进行初始化,即使已经定义了初始化构造函数,也能声明数组。

  7. this和*this是什么

    this指针是类方法可以使用的指针,指向用于调用方法的对象。因此,this是对象的地址,*this是对象本身。