C++ 类之说明

C++ 类

1、C++ OOP简介

面向对象编程(OOP)是一种特殊的、设计程序的概念性方法,OOP重要特性如下:

(1) 抽象
(2) 封装和数据隐藏
(3) 多态
(4) 继承
(5) 代码的可重用性

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

采用书本描述的案例说明,能更容易的让人理解过程性编程面向对象编程

垒球队的一名新球员被要求记录球队的统计数据,会优先考虑使用计算机来完成这项工作,下面描述下过程性编程与OOP编程思想不同之处:

2.1 过程性编程

(1)考虑输入每名选手的姓名、击球次数、击中次数、命中率及其它重要基本数据
(2)还需要显示记录的数据及计算结果(命中率等)

如何完成上述功能工作呢?
(1)可以让main()函数调用一个函数来获取输入
(2)调用另一个函数进行计算
(3)调用第三个函数显示结果

如果获取下一场的数据后又该怎么做呢?
(1)若不想从头开始,可以添加一个函数来更新统计数据
(2)可能需要在main()函数中添加一个菜单,选择是输入、计算、更新还是显示数据。

如何表示记录统计与计算的数据呢?
(1)可以使用一个字符串来存储选手姓名
(2)使用一个数组来存储每一位选手的击球数
(3)使用一个数组来存储击中数目等
(4)或者可以设计一个结构来存储每位选手的所有信息,然后使用这种结构组成的数组来表示整个球队

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

2.2 面向对象编程(OOP)

(1)考虑如何表示数据,还要考虑如何使用数据
(2)考虑以谁为主体去记录处理数据,当然是选手。
(3)因此要有一个对象去表示整个选手的各个方面,这将作为基本数据单元—一个表示选手的姓名和统计数据的对象。

如何对数据进行处理呢?
(1)首先需要一种将基本信息加入到该单元中的方法
(2)其次,计算机应计算一些东西,如命中率等。因此需要添加一些执行计算的方法
(3)程序应自动完成这些计算,而无需用户干涉
(4)还需要一些更新和显示信息的方法
(5)所以用户与数据交互的方式有三种:初始化、更新、报告;这就是用户接口

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

3. 抽象和类

3.1 抽象

生活中充满复杂性,处理复杂性的方法之一是简化和抽象。抽象是通往用户定义类型的捷径。在C++中,用户定义类型指的是实现抽象接口的类设计。

3.2 类型

将变量声明为int或float指针时,不仅仅是分配内存,还规定了可对变量执行的操作。总之,指定基本类型完成了三项工作:
(1)决定数据对象需要的内存数量
(2)决定如何解释内存中的位(long和float在内存中占用的位数相同,但将它们转换为数值的方法不同)
(3)决定可使用数据对象执行的操作或方法

3.3 C++中的类

类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。

定义类时,类规范一般由两部分组成:
(1)类声明:以数据成员的方式描述数据部分,以成员函数(常被称为方法)的方式描述公有接口
(2)类方法定义:描述如何实现类成员函数

简单的说,就是类声明提供了类的蓝图,而方法定义则提供了细节。

3.4 什么是接口

接口是一个共享框架,共两个系统交互时使用(如计算机与打印机之间或者用户与计算机之间)

3.5 设计类步骤

(1)C++程序员将接口(类声明)放在头文件中
(2)将实现(类方法的代码)放在源代码文件中
以下代码为类声明:

class Stock
{
private:
	std::string company;
	long shares;
	double share_val;
	double total_val;
	void set_tot() { total_val = shares * share_val; }
	
public:
	void acquire(const std::string &co, long n, double pr);
	void buy(long num, double price);
	void sell(long num, double price);
	void update(double price);
	void show();	
};

4. 类使用详解

4.1 访问控制

(1) 使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数(或友元函数)来访问对象的私有成员。

(2) 数据隐藏: 防止程序直接访问数据。

(3) 封装: 将实现细节放在一起并将它们与抽象分开,类设计尽可能将公有接口与实现细节分开,说明几种情况下的封装:

A、数据隐藏(将数据放在类的私有部分)是一种封装
B、将实现的细节隐藏在私有部分中是一种封装
C、将类函数定义和类声明放在不同文件中也是一种声明

4.2 公有与私有

无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。但由于数据隐藏是OOP的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分。

不必在类声明中使用关键字private,因为这是类对象的默认访问控制,举例说明:

class World
{
	float mass;			// 默认private
	char name[20];		// 默认private

public:
	void tellall(void);
	...
};

类和结构的区别:
结构的默认访问类型是public,类默认访问类型是private

类与结构使用情况:
c++通常使用类来实现类描述,而把结构限制为只表示纯粹的数据对象(常被称为普通老式数据(POD,Plain Old Data))结构。

4.3 类成员函数实现

成员函数定义与常规函数定义非常相似,它们有函数头与函数体,也可以有返回类型和参数。但它们有两个特殊的特征:

(1) 定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类
(2) 类方法可以访问类的private组件(数据成员)

类方法的完整名称中包括类名。比如,Stock::update()是函数的限定名,而简单的update()是全名的缩写(非限定名),它只能在类作用域中使用。

4.4 内联方法

其定义(函数原型与函数实现放在一起)位于类声明中的函数都将自动成为内联函数。
类声明常将短小的成员函数作为内联函数。

内联函数另一种实现方式:

可以在类声明之外定义成员函数,并使其成为内联函数。只需要在类实现部分中定义函数时使用inline限定符即可,代码举例:

class Stock
{
private:
	void set_tot();					// 定义分开

public:
	...	

private:
	int total;
	int shares;
	int share_val;
};

inline void Stock::set_tot()		// 在定义中使用inline关键字	
{
	total = shares * share_val;
}

说明1: 内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义,确保内联定义对多文件程序中的所有文件都是可用、最简单的方式:将内联定义放在类声明的头文件中。

说明2: 根据改写规则,在类声明中定义方法等同于用原型替换方法定义,然后在类声明的后面将定义改写为内联函数。

你可能感兴趣的:(#,C++,Primer,Plus,c++)